您好,登錄后才能下訂單哦!
這篇文章主要介紹“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í)用的文章!
免責(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)容。