溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java工廠模式怎么寫

發(fā)布時(shí)間:2022-01-05 11:41:24 來(lái)源:億速云 閱讀:136 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“java工廠模式怎么寫”,在日常操作中,相信很多人在java工廠模式怎么寫問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java工廠模式怎么寫”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

    女媧補(bǔ)天的故事大家都聽說(shuō)過(guò)吧,今天不說(shuō)這個(gè),說(shuō)女媧創(chuàng)造人的故事,可不是“造人”的工作,這個(gè)詞被現(xiàn)代人濫用了。這個(gè)故事是說(shuō),女媧在補(bǔ)了天后,下到凡間一看,哇塞,風(fēng)景太優(yōu)美了,天空是湛藍(lán)的,水是清澈的,空氣是清新的,太美麗了,然后就待時(shí)間長(zhǎng)了就有點(diǎn)寂寞了,沒(méi)有動(dòng)物,這些看的到都是靜態(tài)的東西呀,怎么辦?

別忘了是神仙呀,沒(méi)有辦不到的事情,于是女媧就架起了八卦爐(技術(shù)術(shù)語(yǔ):建立工廠)開始創(chuàng)建人,具體過(guò)程是這樣的:先是泥巴捏,然后放八卦爐里烤,再扔到地上成長(zhǎng),但是意外總是會(huì)產(chǎn)生的:

第一次烤泥人,茲茲茲茲~~,感覺應(yīng)該熟了,往地上一扔,biu~,一個(gè)白人誕生了,沒(méi)烤熟!

第二次烤泥人,茲茲茲茲茲茲茲茲~~,上次都沒(méi)烤熟,這次多烤會(huì)兒,往地上一扔,嘿,熟過(guò)頭了,黑人哪!

第三次烤泥人,茲~茲~茲~,一邊烤一邊看著,嘿,正正好,Perfect!優(yōu)品,黃色人種!【備注:RB 人不屬此列】

這個(gè)過(guò)程還是比較有意思的,先看看類圖:(之前在論壇上有兄弟建議加類圖和源文件,以后的模式都會(huì)加上去,之前的會(huì)一個(gè)一個(gè)的補(bǔ)充,目的是讓大家看著舒服,看著愉悅,看著就想要,就像是看色情小說(shuō)一樣,目標(biāo),目標(biāo)而已,能不能實(shí)現(xiàn)就看大家給我的信心了)

那這個(gè)過(guò)程我們就用程序來(lái)表現(xiàn),首先定義一個(gè)人類的總稱:

package com.cbf4life;
/**
*定義一個(gè)人類的統(tǒng)稱
*/

public interface Human {
    //首先定義什么是人類
    //人是愉快的,會(huì)笑的,本來(lái)是想用smile表示,想了一下laugh更合適,好長(zhǎng)時(shí)間沒(méi)有大笑了;
    public	void laugh();
    //人類還會(huì)哭,代表痛苦
    public void cry();
    //人類會(huì)說(shuō)話
    public void talk();
}


然后定義具體的人種:

package com.cbf4life;
/**
*黃色人種,這個(gè)翻譯的不準(zhǔn)確,將就點(diǎn)吧
*/

public class YellowHuman implements Human {

    public void cry() {
        System.out.println("黃色人種會(huì)哭");
    }

    public void laugh() {
        System.out.println("黃色人種會(huì)大笑,幸福呀!");
    }

    public void talk() {
        System.out.println("黃色人種會(huì)說(shuō)話,一般說(shuō)的都是雙字節(jié)");
    }

}

白色人種:

package com.cbf4life;
/**
*白色人種
*/
public class WhiteHuman implements Human {
    public void cry() {
        System.out.println("白色人種會(huì)哭");
    }

    public void laugh() {
        System.out.println("白色人種會(huì)大笑,侵略的笑聲");
    }

    public void talk() {
        System.out.println("白色人種會(huì)說(shuō)話,一般都是但是單字節(jié)!");
    }
}

同理,黑色人種,這里一樣,就不定義了

人種也定義完畢了,那我們把八卦爐定義出來(lái):

package com.cbf4life;

import java.util.List;
import java.util.Random;

/**
*今天講女媧造人的故事,這個(gè)故事梗概是這樣的:
*很久很久以前,盤古開辟了天地,用身軀造出日月星辰、山川草木,天地一片繁華
*One day,女媧下界走了一遭,哎!太寂寞,太孤獨(dú)了,沒(méi)個(gè)會(huì)笑的、會(huì)哭的、會(huì)說(shuō)話的東東
*那怎么辦呢?不用愁,女媧,神仙呀,造出來(lái)呀,然后捏泥巴,放八卦爐(后來(lái)這個(gè)成了太白金星的寶貝)中烤,于是就有了人:
*我們把這個(gè)生產(chǎn)人的過(guò)程用Java程序表現(xiàn)出來(lái):
*/

public class HumanFactory {
    //定一個(gè)烤箱,泥巴塞進(jìn)去,人就出來(lái),這個(gè)太先進(jìn)了
    public static Human createHuman(Class c){ Human human=null; //定義一個(gè)類型的人類

    try {
        human = (Human)Class.forName(c.getName()).newInstance();	//產(chǎn)生一個(gè)人種
    } catch (InstantiationException e) {//你要是不說(shuō)個(gè)人種顏色的話,沒(méi)法烤,要白的黑,你說(shuō)話了才好烤
        System.out.println("必須指定人種的顏色");
    } catch (IllegalAccessException e) { //定義的人種有問(wèn)題,那就烤不出來(lái)了,這是...
        System.out.println("人種定義錯(cuò)誤!");
    } catch (ClassNotFoundException e) { //你隨便說(shuō)個(gè)人種,我到哪里給你制造去?!
        System.out.println("混蛋,你指定的人種找不到!");
    }
    return human;

    }
}

然后我們?cè)侔雅畫z聲明出來(lái)

package com.cbf4life;

/**
*首先定義女媧,這真是額的神呀
*/

public class NvWa {
    public static void main(String[] args) {
        //女媧第一次造人,試驗(yàn)性質(zhì),少造點(diǎn),火候不足,缺陷產(chǎn)品
        System.out.println("------------造出的第一批人是這樣的:白人-----------------");
        Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
        whiteHuman.cry();
        whiteHuman.laugh();
        whiteHuman.talk();

        //女媧第二次造人,火候加足點(diǎn),然后又出了個(gè)次品,黑人
        System.out.println("\n\n------------造出的第二批人是這樣的:黑人-----------------");
        Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
        blackHuman.cry();
        blackHuman.laugh();
        blackHuman.talk();
    
        //第三批人了,這次火候掌握的正好,黃色人種(不寫黃人,免得引起歧義),備注:RB人不屬于此列
        System.out.println("\n\n------------造出的第三批人是這樣的:黃色人種-----------------");
        Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
        yellowHuman.cry();
        yellowHuman.laugh();
        yellowHuman.talk()

    }
}

這樣這個(gè)世界就熱鬧起來(lái)了,人也有了,但是這樣創(chuàng)建太累了,神仙也會(huì)累的,那怎么辦?神仙就想了:我塞進(jìn)去一團(tuán)泥巴,隨機(jī)出來(lái)一群人,管他是黑人、白人、黃人,只要是人就成(你看看,神仙都偷懶,何況是我們?nèi)耍?,先修改類圖:

然后看我們的程序修改,先修改 HumanFactory.java,增加了 createHuman()方法:

package com.cbf4life;

import java.util.List;
import java.util.Random;
    public class HumanFactory {
    //定一個(gè)烤箱,泥巴塞進(jìn)去,人就出來(lái),這個(gè)太先進(jìn)了
    public static Human createHuman(Class c){ Human human=null; //定義一個(gè)類型的人類
        try {
            human = (Human)Class.forName(c.getName()).newInstance();	//產(chǎn)生一個(gè)人種
        } catch (InstantiationException e) {//你要是不說(shuō)個(gè)人種顏色的話,沒(méi)法烤,要白的黑,你說(shuō)話了才好烤
            System.out.println("必須指定人種的顏色");
        } catch (IllegalAccessException e) { //定義的人種有問(wèn)題,那就烤不出來(lái)了,這是...
                System.out.println("人種定義錯(cuò)誤!");
        } catch (ClassNotFoundException e) { //你隨便說(shuō)個(gè)人種,我到哪里給你制造去?!
                System.out.println("混蛋,你指定的人種找不到!");
        }

    return human;
}

    //女媧生氣了,把一團(tuán)泥巴塞到八卦爐,哎產(chǎn)生啥人種就啥人種
        public static Human createHuman(){ Human human=null; //定義一個(gè)類型的人類
        //首先是獲得有多少個(gè)實(shí)現(xiàn)類,多少個(gè)人種
        List<Class> concreteHumanList =ClassUtils.getAllClassByInterface(Human.class);	//定義了多少人種
        //八卦爐自己開始想燒出什么人就什么人
        Random random = new Random();
        int rand = random.nextInt(concreteHumanList.size());
        human = createHuman(concreteHumanList.get(rand));
        return human;
        }

}

然后看女媧是如何做的:

public class NvWa {

    public static void main(String[] args) {
        //女媧第一次造人,試驗(yàn)性質(zhì),少造點(diǎn),火候不足,缺陷產(chǎn)品
        System.out.println("------------造出的第一批人是這樣的:白人-----------------");
        Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
        whiteHuman.cry();
        whiteHuman.laugh();
        whiteHuman.talk();

        //女媧第二次造人,火候加足點(diǎn),然后又出了個(gè)次品,黑人
        System.out.println("\n\n------------造出的第二批人是這樣的:黑人-----------------");
        Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
        blackHuman.cry();
        blackHuman.laugh();
        blackHuman.talk();

        //第三批人了,這次火候掌握的正好,黃色人種(不寫黃人,免得引起歧義),備注:RB人不屬于此列
        System.out.println("\n\n------------造出的第三批人是這樣的:黃色人種-----------------");
        Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
        yellowHuman.cry();
        yellowHuman.laugh();
        yellowHuman.talk();

        //女媧煩躁了,愛是啥人種就是啥人種,燒吧
        for(int i=0;i<10000000000;i++){
                System.out.println("\n\n------------隨機(jī)產(chǎn)生人種了-----------------" +i);
                Human human = HumanFactory.createHuman();
                human.cry();
                human.laugh();
                human.talk();
        }
    }
}

哇,這個(gè)世界熱鬧了!,不過(guò)還沒(méi)有完畢,這個(gè)程序你跑不起來(lái),還要有這個(gè)類:

package com.cbf4life;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

@SuppressWarnings("all")
public class ClassUtils {
    //給一個(gè)接口,返回這個(gè)接口的所有實(shí)現(xiàn)類
    public static List<Class> getAllClassByInterface(Class c){ List<Class> returnClassList = new ArrayList<Class>(); //返回結(jié)果

    //如果不是一個(gè)接口,則不做處理
    if(c.isInterface()){
        String packageName = c.getPackage().getName(); //獲得當(dāng)前的包名 try {
                List<Class>	allClass = getClasses(packageName);	//獲得當(dāng)前包下以及子包下的所有類
                //判斷是否是同一個(gè)接口
                for(int i=0;i<allClass.size();i++){ 
                    if(c.isAssignableFrom(allClass.get(i))){	//判斷是不是一個(gè)接口
                            if(!c.equals(allClass.get(i))){ //本身不加進(jìn)去 returnClassList.add(allClass.get(i));
                            }
                    }
                }
            } catch (ClassNotFoundException e) { e.printStackTrace();
            } catch (IOException e) { e.printStackTrace();
            }
        }
        return returnClassList;
    }

    //從一個(gè)包中查找出所有的類,在jar包中不能查找
    private static List<Class> getClasses(String packageName) throws ClassNotFoundException, IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<File>(); while (resources.hasMoreElements()) {
                    URL resource = resources.nextElement(); dirs.add(new File(resource.getFile()));
        }
        ArrayList<Class> classes = new ArrayList<Class>(); for (File directory : dirs) {
                classes.addAll(findClasses(directory, packageName));
        }
        return classes;
    }

    private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>(); if (!directory.exists()) {
           return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." +file.getName()));
            } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' +file.getName().substring(0, file.getName().length() - 6)));
        }
    }
    return classes;
    }
}

到此,關(guān)于“java工廠模式怎么寫”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI