溫馨提示×

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

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

java抽象工廠模式怎么實(shí)現(xiàn)

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

本篇內(nèi)容介紹了“java抽象工廠模式怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

抽象工廠只實(shí)現(xiàn)了一個(gè) createHuman 的方法,目的是簡(jiǎn)化實(shí)現(xiàn)類的代碼工作量,這個(gè)在講代碼的時(shí)候會(huì)說(shuō)。這里還使用了 Jdk 1.5 的一個(gè)新特性 Enum 類型,其實(shí)這個(gè)完全可以類的靜態(tài)變量來(lái)實(shí)現(xiàn),但我想既然是學(xué)習(xí)就應(yīng)該學(xué)有所獲得,即使你對(duì)這個(gè)模式非常了解,也可能沒(méi)用過(guò) Enum 類型,也算是一個(gè)不同的知識(shí)點(diǎn)吧,我希望給大家講解,每次都有新的技術(shù)點(diǎn)提出來(lái),每個(gè)人都會(huì)有一點(diǎn)的收獲就足夠了,然后在具體的項(xiàng)目中使用時(shí),知道有這個(gè)技術(shù)點(diǎn),然后上 baidu 狗狗一下就能解決問(wèn)題。

我們來(lái)看程序?qū)崿F(xiàn):

package com.cbf4life;
/**
*定義一個(gè)人類的統(tǒng)稱,問(wèn)題出來(lái)了,剛剛定義的時(shí)候忘記定義性別了
*這個(gè)重要的問(wèn)題非修改不可,否則這個(gè)世界上太多太多的東西不存在了
*/

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();

    //定義性別
    public void sex();
}

人類的接口定義好,然后根據(jù)接口創(chuàng)建三個(gè)抽象類,也就是三個(gè)產(chǎn)品等級(jí),實(shí)現(xiàn) laugh()、cry()、talk()三個(gè)方法,以 AbstractYellowHuman 為例:

package com.cbf4life.yellowHuman;
import com.cbf4life.Human;
/**
*為什么要修改成抽象類呢?要定義性別呀
*/
public abstract class AbstractYellowHuman 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é)");
    }
}

其他的兩個(gè)抽象類 AbstractWhiteHuman 和 AbstractgBlackHuman 與此類似的事項(xiàng)方法,不再通篇拷貝代碼

       三個(gè)抽象類都實(shí)現(xiàn)完畢了,然后就是些實(shí)現(xiàn)類了。其實(shí),你說(shuō)抽象類放這里有什么意義嗎?就是不允許你 new 出來(lái)一個(gè)抽象的對(duì)象唄,使用非抽象類完全就可以代替,呵呵,殺豬殺尾巴,各有各的殺法,不過(guò)既然進(jìn)了 Java 這個(gè)門就要遵守 Java 這個(gè)規(guī)矩,我們看實(shí)現(xiàn)類:

        女性黃種人的實(shí)現(xiàn)類:

package com.cbf4life.yellowHuman;
/**
*女性黃種人
*/
public class YellowFemaleHuman extends AbstractYellowHuman {
    public void sex() {
        System.out.println("該黃種人的性別為女...");
    }
}

男性黃種人的實(shí)現(xiàn)類:

package com.cbf4life.yellowHuman;

/**
*男性黃種人
*/
public class YellowMaleHuman extends AbstractYellowHuman {
    public void sex() {
        System.out.println("該黃種人的性別為男....");
    }
}

同理可知,女性白種人,男性白種人,女性黑種人,男性黑種人都是對(duì)性別的實(shí)現(xiàn)。

抽象工廠模式下的產(chǎn)品等級(jí)和產(chǎn)品族都已經(jīng)完成,也就是人類以及產(chǎn)生出的人類是什么樣子的都已經(jīng)定義好了,下一步就等著工廠開(kāi)工創(chuàng)建了,那我們來(lái)看工廠類。在看工廠類之前我們先看那個(gè)枚舉類型,這個(gè)是很有意思的

package com.cbf4life;
/**
*世界上有哪些類型的人,列出來(lái)
*JDK 1.5開(kāi)始引入enum類型也是目的的,吸引C程序員轉(zhuǎn)過(guò)來(lái)
*/

public enum HumanEnum {

   //把世界上所有人類型都定義出來(lái)
    YelloMaleHuman("com.cbf4life.yellowHuman.YellowMaleHuman"),
    YelloFemaleHuman("com.cbf4life.yellowHuman.YellowFemaleHuman"),
    WhiteFemaleHuman("com.cbf4life.whiteHuman.WhiteFemaleHuman"),
    WhiteMaleHuman("com.cbf4life.whiteHuman.WhiteMaleHuman"),
    BlackFemaleHuman("com.cbf4life.blackHuman.BlackFemaleHuman"),
    BlackMaleHuman("com.cbf4life.blackHuman.BlackMaleHuman");
    private String value = "";

    //定義構(gòu)造函數(shù),目的是Data(value)類型的相匹配
    private HumanEnum(String value){
        this.value = value;
    }

    public String getValue(){ 
        return this.value;
    }
}

然后,我們看我們的工廠類,先看接口:

package com.cbf4life;

/**
*這次定一個(gè)接口,應(yīng)該要造不同性別的人,需要不同的生產(chǎn)線
*那這個(gè)八卦爐必須可以制造男人和女人
*/
public interface HumanFactory {

    //制造黃色人種
    public Human createYellowHuman();

    //制造一個(gè)白色人種
    public Human createWhiteHuman();

    //制造一個(gè)黑色人種
    public Human createBlackHuman();

}

然后看抽象類:

package com.cbf4life.humanFactory;

import com.cbf4life.Human;
import com.cbf4life.HumanEnum;
import com.cbf4life.HumanFactory;

public abstract class AbstractHumanFactory implements HumanFactory {
/*
*給定一個(gè)性別人種,創(chuàng)建一個(gè)人類出來(lái) 專業(yè)術(shù)語(yǔ)是產(chǎn)生產(chǎn)品等級(jí)
*/
    protected Human createHuman(HumanEnum humanEnum) { Human human = null;
        //如果傳遞進(jìn)來(lái)不是一個(gè)Enum中具體的一個(gè)Element的話,則不處理
        if (!humanEnum.getValue().equals("")) {
            try {
                //直接產(chǎn)生一個(gè)實(shí)例
                human = (Human)
                Class.forName(humanEnum.getValue()).newInstance();
            } catch (Exception e) {
                //因?yàn)槭褂昧薳num,這個(gè)種異常情況不會(huì)產(chǎn)生了,除非你的enum有問(wèn)題;
                e.printStackTrace();
              }
        }//if結(jié)束
    return human;
    }
}

看到?jīng)],這就是引入 enum 的好處,createHuman(HumanEnum humanEnum)這個(gè)方法定義了輸入?yún)?shù)必須是 HumanEnum 類型,然后直接使用 humanEnum.getValue()方法就能獲得具體傳遞進(jìn)來(lái)的值,這個(gè)不多說(shuō)了,
大家自己看程序領(lǐng)會(huì),沒(méi)多大難度,這個(gè)抽象類的目的就是減少下邊實(shí)現(xiàn)類的代碼量,我們看實(shí)現(xiàn)類:
男性工廠,只創(chuàng)建男性:

package com.cbf4life.humanFactory;

import com.cbf4life.Human;
import com.cbf4life.HumanEnum;

/**
*男性創(chuàng)建工廠
*/
    public class MaleHumanFactory extends AbstractHumanFactory {
        //創(chuàng)建一個(gè)男性黑種人
        public Human createBlackHuman() {
                return super.createHuman(HumanEnum.BlackMaleHuman);
        }

        //創(chuàng)建一個(gè)男性白種人
        public Human createWhiteHuman() {
                return super.createHuman(HumanEnum.WhiteMaleHuman);
        }

        //創(chuàng)建一個(gè)男性黃種人
        public Human createYellowHuman() {
                return super.createHuman(HumanEnum.YelloMaleHuman);
        }

}

女性工廠,只創(chuàng)建女性:

package com.cbf4life.humanFactory;

import com.cbf4life.Human;
import com.cbf4life.HumanEnum;

/**
*女性創(chuàng)建工廠
*/
public class FemaleHumanFactory extends AbstractHumanFactory {

    //創(chuàng)建一個(gè)女性黑種人
    public Human createBlackHuman() {
        return super.createHuman(HumanEnum.BlackFemaleHuman);
    }

    //創(chuàng)建一個(gè)女性白種人
    public Human createWhiteHuman() {
        return super.createHuman(HumanEnum.WhiteFemaleHuman);
    }

    //創(chuàng)建一個(gè)女性黃種人
    public Human createYellowHuman() {
        return super.createHuman(HumanEnum.YelloFemaleHuman);
    }
}

產(chǎn)品定義好了,工廠也定義好了,萬(wàn)事俱備只欠東風(fēng),那咱就開(kāi)始造吧,哦,不對(duì),女媧開(kāi)始造人了

public class NvWa {
    public static void main(String[] args) {
        //第一條生產(chǎn)線,男性生產(chǎn)線
        HumanFactory maleHumanFactory = new MaleHumanFactory();

        //第二條生產(chǎn)線,女性生產(chǎn)線
        HumanFactory femaleHumanFactory = new FemaleHumanFactory();

        //生產(chǎn)線建立完畢,開(kāi)始生產(chǎn)人了:
        Human maleYellowHuman = maleHumanFactory.createYellowHuman();
        Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
        maleYellowHuman.cry();
        maleYellowHuman.laugh();
        femaleYellowHuman.sex();
        /*
        *.....
        *后面你可以續(xù)了
        */
    }
}

“java抽象工廠模式怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(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