首頁 >Java >java教程 >實例詳解JAVA抽象工廠模式

實例詳解JAVA抽象工廠模式

WBOY
WBOY轉載
2022-04-20 12:50:492751瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於抽象工廠模式的相關問題,根據實際的示例來學習什麼是抽象工廠模式,下面一起來看一下,希望對大家有幫助。

實例詳解JAVA抽象工廠模式

推薦學習:《java影片教學

什麼是抽象工廠模式

#抽象工廠(AbstractFactory)模式的定義: 是一種為訪問類別提供一個創建一組相關或相互依賴對象的接口,且訪問類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。

滿足條件:

  • 系統中有多個產品族,每個特定工廠創建同一族但屬於不同等級結構的產品。
  • 系統一次只可能消費其中某一族產品,即同族的產品一起使用。

優點:

  • 可以在類別的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類別來進行管理。

  • 當需要產品族時,抽象工廠可以保證客戶端總是只使用同一個產品的產品組。

  • 抽象工廠增強了程式的可擴展性,當增加一個新的產品族時,不需要修改原始程式碼,滿足開閉原則。

缺點:

  • 當產品族中需要增加一個新的產品時,所有的工廠類別都需要修改。增加了系統的抽象性和理解難度。

抽象工廠的實現

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

案例:
大師擁有七俠傳承,會打造至陽之劍和培養雄性小靈鴿。
師娘擁有七俠傳承,會打造至陰之劍和培養雌性小靈鴿。
七俠找師傅師娘打造自己的劍和領養自己的小靈鴿。

抽象產品、產品

S1介面(天外隕石):

介面內宣告了一個方法

public interface S1 {
    void show();}

S2介面(一窩靈鴿蛋):

介面內部宣告了一個方法

public interface S2 {
    void show();}

A1類實作介面S1(長虹劍):

實作S1介面

public class A1 implements S1 {
    @Override
    public void show() {
        System.out.println("打造了一把长虹剑");

    }}

B1類別實作介面S1(冰魄劍):

實作S1介面

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

    }}

C1類別實作介面S1(紫雲劍):

實作S1介面

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

D1類別實作介面S1(雨花劍):

實作S1介面

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

E1類別實作介面S1(青光劍):

實作Ss介面

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

F1類別實作介面S1(奔雷劍):

實作Ss介面

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

G1類別實作介面S1(旋風劍):

實作Ss介面

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

A2類別實作介面S2(靈鴿一號):

實作S1介面

#
public class A2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");

    }}

B2類別實作介面S2(靈鴿二號):

#實作S1介面

public class B2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");

    }}

#C2類別實作介面S2(靈鴿三號):

實作S1介面

public class C2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");
    }}

D2類別實作介面S2(靈鴿四號) :

實作S1介面

public class D2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");
    }}

#E2類別實作介面S2(靈鴿五號):

實作Ss介面

public class E2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");
    }}

F2類別實作介面S2(靈鴿六號):

實作Ss介面

#
public class F2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");
    }}

G2類別實作介面S2(靈鴿七號):

#實作Ss介面

public class G2 implements S2 {
    @Override
    public void show() {
        System.out.println("灵鸽七号");
    }}

抽象工廠、工廠

Zz介面(七俠傳承):

介面內宣告了一個鑄劍方法abc1()和一個養鴿子方法abc2()

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

Nan類別實作介面Zz(師傅):

#實作Zz介面

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

    public S1 abc1(String a) {
        if ("长虹剑".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 ("旋风剑".equals(a)) {
            s1 = new G1();
        } else {
            System.out.println("铸剑失败");
        }
        return s1;
    }
    public S2 abc2(String a) {
        if ("灵鸽一号".equals(a)) {
            s2 = new A2();
        } else if ("灵鸽二号".equals(a)) {
            s2 = new F2();
        } else if ("灵鸽三号".equals(a)) {
            s2 = new E2();
        } else if ("灵鸽四号".equals(a)) {
            s2 = new D2();
        } else if ("灵鸽五号".equals(a)) {
            s2 = new G2();
        } else {
            System.out.println("领养失败");
        }
        return s2;
    }}

Nv類實作介面Zz(師娘):

實作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 ("灵鸽六号".equals(a)) {
            s2 = new B2();
        } else if ("灵鸽七号".equals(a)) {
            s2 = new C2();
        } else {
            System.out.println("领养失败");
        }
        return s2;
    }}

測試

##測試類別:

public class Demo {
    public static void main(String[] args) {
        System.out.println("---------至阳传承-------------");
        //师傅
        Nan nan = new Nan();
        //造剑
        S1 a1 = nan.abc1("长虹剑");
        S1 d1 = nan.abc1("雨花剑");
        S1 e1 = nan.abc1("青光剑");
        S1 f1 = nan.abc1("奔雷剑");
        S1 g1 = nan.abc1("旋风剑");
        //养鸽子
        S2 a2 = nan.abc2("灵鸽一号");
        S2 d2 = nan.abc2("灵鸽二号");
        S2 e2 = nan.abc2("灵鸽三号");
        S2 f2 = nan.abc2("灵鸽四号");
        S2 g2 = nan.abc2("灵鸽五号");
        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("灵鸽六号");
        S2 c2 = nv.abc2("灵鸽七号");
        b2.show();
        c2.show();
    }}
推薦學習:《

java影片教學

以上是實例詳解JAVA抽象工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除