溫馨提示×

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

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

JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-04-20 13:38:38 來(lái)源:億速云 閱讀:163 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)”吧!

JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)

什么是抽象工廠模式

抽象工廠(AbstractFactory)模式的定義: 是一種為訪問類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象的接口,且訪問類無(wú)須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。

滿足條件:

  • 系統(tǒng)中有多個(gè)產(chǎn)品族,每個(gè)具體工廠創(chuàng)建同一族但屬于不同等級(jí)結(jié)構(gòu)的產(chǎn)品。

  • 系統(tǒng)一次只可能消費(fèi)其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用。

優(yōu)點(diǎn):

  • 可以在類的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專門引入多個(gè)新的類來(lái)進(jìn)行管理。

  • 當(dāng)需要產(chǎn)品族時(shí),抽象工廠可以保證客戶端始終只使用同一個(gè)產(chǎn)品的產(chǎn)品組。

  • 抽象工廠增強(qiáng)了程序的可擴(kuò)展性,當(dāng)增加一個(gè)新的產(chǎn)品族時(shí),不需要修改原代碼,滿足開閉原則。

缺點(diǎn):

  • 當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度。

抽象工廠的實(shí)現(xiàn)

案例的主要角色如下:
抽象工廠(Abstract Factory): 七俠傳承
工廠(SimpleFactory): 師傅、師娘
抽象產(chǎn)品(Product): 天外隕石(鑄劍的原材料)、一窩靈鴿蛋(未孵化的靈鴿)
具體產(chǎn)品(ConcreteProduct): 七劍。七只靈鴿

案例:
師傅擁有七俠傳承,會(huì)打造至陽(yáng)之劍和培養(yǎng)雄性小靈鴿。
師娘擁有七俠傳承,會(huì)打造至陰之劍和培養(yǎng)雌性小靈鴿。
七俠找?guī)煾祹熌锎蛟熳约旱膭皖I(lǐng)養(yǎng)自己的小靈鴿。

抽象產(chǎn)品、產(chǎn)品

S1接口(天外隕石):

接口內(nèi)聲明了一個(gè)方法

public interface S1 {
    void show();}

S2接口(一窩靈鴿蛋):

接口內(nèi)聲明了一個(gè)方法

public interface S2 {
    void show();}

A1類實(shí)現(xiàn)接口S1(長(zhǎng)虹劍):

實(shí)現(xiàn)S1接口

public class A1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把長(zhǎng)虹劍");

    }}

B1類實(shí)現(xiàn)接口S1(冰魄劍):

實(shí)現(xiàn)S1接口

public class B1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把冰魄劍");

    }}

C1類實(shí)現(xiàn)接口S1(紫云劍):

實(shí)現(xiàn)S1接口

public class C1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把紫云劍");
    }}

D1類實(shí)現(xiàn)接口S1(雨花劍):

實(shí)現(xiàn)S1接口

public class D1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把紫云劍");
    }}

E1類實(shí)現(xiàn)接口S1(青光劍):

實(shí)現(xiàn)Ss接口

public class E1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把紫云劍");
    }}

F1類實(shí)現(xiàn)接口S1(奔雷劍):

實(shí)現(xiàn)Ss接口

public class F1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把紫云劍");
    }}

G1類實(shí)現(xiàn)接口S1(旋風(fēng)劍):

實(shí)現(xiàn)Ss接口

public class G1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把紫云劍");
    }}

A2類實(shí)現(xiàn)接口S2(靈鴿一號(hào)):

實(shí)現(xiàn)S1接口

public class A2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");

    }}

B2類實(shí)現(xiàn)接口S2(靈鴿二號(hào)):

實(shí)現(xiàn)S1接口

public class B2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");

    }}

C2類實(shí)現(xiàn)接口S2(靈鴿三號(hào)):

實(shí)現(xiàn)S1接口

public class C2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");
    }}

D2類實(shí)現(xiàn)接口S2(靈鴿四號(hào)):

實(shí)現(xiàn)S1接口

public class D2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");
    }}

E2類實(shí)現(xiàn)接口S2(靈鴿五號(hào)):

實(shí)現(xiàn)Ss接口

public class E2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");
    }}

F2類實(shí)現(xiàn)接口S2(靈鴿六號(hào)):

實(shí)現(xiàn)Ss接口

public class F2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");
    }}

G2類實(shí)現(xiàn)接口S2(靈鴿七號(hào)):

實(shí)現(xiàn)Ss接口

public class G2 implements S2 {
    @Override
    public void show() {
        System.out.println("靈鴿七號(hào)");
    }}

抽象工廠、工廠

Zz接口(七俠傳承):

接口內(nèi)聲明了一個(gè)鑄劍方法abc1()和一個(gè)養(yǎng)鴿子方法abc2()

public interface Zz {
    S1 abc1(String a);
    S2 abc2(String a);}

Nan類實(shí)現(xiàn)接口Zz(師傅):

實(shí)現(xiàn)Zz接口

public class Nan implements Zz {
    private static S1 s1;
    private static S2 s2;

    public S1 abc1(String a) {
        if ("長(zhǎng)虹劍".equals(a)) {
            s1 = new A1();
        } else if ("奔雷劍".equals(a)) {
            s1 = new F1();
        } else if ("青光劍".equals(a)) {
            s1 = new E1();
        } else if ("雨花劍".equals(a)) {
            s1 = new D1();
        } else if ("旋風(fēng)劍".equals(a)) {
            s1 = new G1();
        } else {
            System.out.println("鑄劍失敗");
        }
        return s1;
    }
    public S2 abc2(String a) {
        if ("靈鴿一號(hào)".equals(a)) {
            s2 = new A2();
        } else if ("靈鴿二號(hào)".equals(a)) {
            s2 = new F2();
        } else if ("靈鴿三號(hào)".equals(a)) {
            s2 = new E2();
        } else if ("靈鴿四號(hào)".equals(a)) {
            s2 = new D2();
        } else if ("靈鴿五號(hào)".equals(a)) {
            s2 = new G2();
        } else {
            System.out.println("領(lǐng)養(yǎng)失敗");
        }
        return s2;
    }}

Nv類實(shí)現(xiàn)接口Zz(師娘):

實(shí)現(xiàn)Zz接口

public class Nv implements Zz {
    private static S1 s1;
    private static S2 s2;

    public S1 abc1(String a) {
        if ("冰魄劍".equals(a)) {
            s1 = new B1();
        } else if ("紫云劍".equals(a)) {
            s1 = new C1();
        } else {
            System.out.println("鑄劍失敗");
        }
        return s1;
    }
    public S2 abc2(String a) {
        if ("靈鴿六號(hào)".equals(a)) {
            s2 = new B2();
        } else if ("靈鴿七號(hào)".equals(a)) {
            s2 = new C2();
        } else {
            System.out.println("領(lǐng)養(yǎng)失敗");
        }
        return s2;
    }}

測(cè)試

測(cè)試類:

public class Demo {
    public static void main(String[] args) {
        System.out.println("---------至陽(yáng)傳承-------------");
        //師傅
        Nan nan = new Nan();
        //造劍
        S1 a1 = nan.abc1("長(zhǎng)虹劍");
        S1 d1 = nan.abc1("雨花劍");
        S1 e1 = nan.abc1("青光劍");
        S1 f1 = nan.abc1("奔雷劍");
        S1 g1 = nan.abc1("旋風(fēng)劍");
        //養(yǎng)鴿子
        S2 a2 = nan.abc2("靈鴿一號(hào)");
        S2 d2 = nan.abc2("靈鴿二號(hào)");
        S2 e2 = nan.abc2("靈鴿三號(hào)");
        S2 f2 = nan.abc2("靈鴿四號(hào)");
        S2 g2 = nan.abc2("靈鴿五號(hào)");
        a1.show();
        d1.show();
        e1.show();
        f1.show();
        g1.show();
        a2.show();
        d2.show();
        e2.show();
        f2.show();
        g2.show();
        System.out.println("---------至陰傳承-------------");
        //女鑄劍師
        Nv nv = new Nv();
        S1 b1 = nv.abc1("冰魄劍");
        S1 c1 = nv.abc1("紫云劍");
        b1.show();
        c1.show();
        S2 b2 = nv.abc2("靈鴿六號(hào)");
        S2 c2 = nv.abc2("靈鴿七號(hào)");
        b2.show();
        c2.show();
    }}

感謝各位的閱讀,以上就是“JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JAVA抽象工廠模式是什么及怎么實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(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