中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java工廠模式怎么寫

發布時間:2022-01-05 11:41:24 來源:億速云 閱讀:137 作者:iii 欄目:大數據

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

    女媧補天的故事大家都聽說過吧,今天不說這個,說女媧創造人的故事,可不是“造人”的工作,這個詞被現代人濫用了。這個故事是說,女媧在補了天后,下到凡間一看,哇塞,風景太優美了,天空是湛藍的,水是清澈的,空氣是清新的,太美麗了,然后就待時間長了就有點寂寞了,沒有動物,這些看的到都是靜態的東西呀,怎么辦?

別忘了是神仙呀,沒有辦不到的事情,于是女媧就架起了八卦爐(技術術語:建立工廠)開始創建人,具體過程是這樣的:先是泥巴捏,然后放八卦爐里烤,再扔到地上成長,但是意外總是會產生的:

第一次烤泥人,茲茲茲茲~~,感覺應該熟了,往地上一扔,biu~,一個白人誕生了,沒烤熟!

第二次烤泥人,茲茲茲茲茲茲茲茲~~,上次都沒烤熟,這次多烤會兒,往地上一扔,嘿,熟過頭了,黑人哪!

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

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

那這個過程我們就用程序來表現,首先定義一個人類的總稱:

package com.cbf4life;
/**
*定義一個人類的統稱
*/

public interface Human {
    //首先定義什么是人類
    //人是愉快的,會笑的,本來是想用smile表示,想了一下laugh更合適,好長時間沒有大笑了;
    public	void laugh();
    //人類還會哭,代表痛苦
    public void cry();
    //人類會說話
    public void talk();
}


然后定義具體的人種:

package com.cbf4life;
/**
*黃色人種,這個翻譯的不準確,將就點吧
*/

public class YellowHuman implements Human {

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

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

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

}

白色人種:

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

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

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

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

人種也定義完畢了,那我們把八卦爐定義出來:

package com.cbf4life;

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

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

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

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

    }
}

然后我們再把女媧聲明出來

package com.cbf4life;

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

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

        //女媧第二次造人,火候加足點,然后又出了個次品,黑人
        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()

    }
}

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

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

package com.cbf4life;

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

    return human;
}

    //女媧生氣了,把一團泥巴塞到八卦爐,哎產生啥人種就啥人種
        public static Human createHuman(){ Human human=null; //定義一個類型的人類
        //首先是獲得有多少個實現類,多少個人種
        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) {
        //女媧第一次造人,試驗性質,少造點,火候不足,缺陷產品
        System.out.println("------------造出的第一批人是這樣的:白人-----------------");
        Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
        whiteHuman.cry();
        whiteHuman.laugh();
        whiteHuman.talk();

        //女媧第二次造人,火候加足點,然后又出了個次品,黑人
        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------------隨機產生人種了-----------------" +i);
                Human human = HumanFactory.createHuman();
                human.cry();
                human.laugh();
                human.talk();
        }
    }
}

哇,這個世界熱鬧了!,不過還沒有完畢,這個程序你跑不起來,還要有這個類:

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 {
    //給一個接口,返回這個接口的所有實現類
    public static List<Class> getAllClassByInterface(Class c){ List<Class> returnClassList = new ArrayList<Class>(); //返回結果

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

    //從一個包中查找出所有的類,在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;
    }
}

到此,關于“java工廠模式怎么寫”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍城县| 桃园县| 本溪| 瑞昌市| 湖北省| 巴彦淖尔市| 古蔺县| 儋州市| 齐河县| 巴东县| 望江县| 沁源县| 永福县| 哈巴河县| 南安市| 泾源县| 临沭县| 峨边| 固安县| 启东市| 横峰县| 高青县| 宿迁市| 双城市| 开化县| 武平县| 无锡市| 平阳县| 尼勒克县| 泸水县| 资阳市| 安阳县| 长宁区| 澎湖县| 石首市| 长乐市| 简阳市| 阿合奇县| 怀化市| 阿瓦提县| 栾川县|