你一定能理解的抽象工廠模式!!!

定義

抽象工廠模式提供了一個創建一系列相關或者相互依賴對象的接口,無需指定它們具體的類。

瞭解產品族概念

在開始看例子之前,得先知道產品族這個概念。
在這裏插入圖片描述
由這個圖可以看出,小米手機和小米路由器是一個產品族,知道了這個概念下面就好理解了。

例子詳解抽象工廠模式

咱們先來看一個UML類圖。
在這裏插入圖片描述

1、ProductA,咱們讓它爲手機產品接口。ProductB,爲路由器產品接口。

2、ProductA1爲小米手機實現了手機產品接口,ProductA2爲華爲手機實現了手機產品接口。

3、ProductB1爲小米路由器實現了路由器產品接口,ProductB2爲華爲路由器實現了路由器產品接口。

4、Creator爲抽象產品工廠接口,接口中有兩個方法,一個生產手機,一個生產路由器。

5、ConcreteCreator1爲小米系列產品(也就是小米產品族:這裏包含小米手機與小米路由器)的生產。ConcreteCreator2爲華爲系列產品(也就是華爲產品族:這裏包含華爲手機與華爲路由器)的生產。

理解了上面的描,再來看具體的代碼,如果不理解,就多看幾遍,多看幾遍,多看幾遍。

//手機產品接口
public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSMS();
}

//路由器產品接口
public interface IRouterProduct {
    void start();
    void shutdown();
    void openWife();
    void setting();
}

//小米手機實現手機接口
public class XiaoMiPhone implements IphoneProduct {
    @Override
    public void start() {
        System.out.println("開啓小米手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米手機");
    }

    @Override
    public void callup() {
        System.out.println("小米打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米發短信");
    }
}

//華爲手機實現手機接口
public class HuaweiPhone implements IphoneProduct {
    @Override
    public void start() {
        System.out.println("開啓華爲手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華爲手機");
    }

    @Override
    public void callup() {
        System.out.println("華爲打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("華爲發短信");
    }
}

//小米路由器實現路由器接口
public class XiaoMiRouter implements  IRouterProduct{
    @Override
    public void start() {
        System.out.println("啓動小米路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米路由器");
    }

    @Override
    public void openWife() {
        System.out.println("打開小米Wifi");
    }

    @Override
    public void setting() {
        System.out.println("小米設置");
    }
}

//華爲路由器實現路由器接口
public class HuaweiRouter implements  IRouterProduct{
    @Override
    public void start() {
        System.out.println("啓動華爲路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華爲路由器");
    }

    @Override
    public void openWife() {
        System.out.println("打開華爲Wifi");
    }

    @Override
    public void setting() {
        System.out.println("華爲設置");
    }
}



//抽象產品工廠
public interface IProductFactory {
    //生產手機
    IphoneProduct iphoneProduct();

    //生產路由器
    IRouterProduct routerProduct();
}


//小米工廠實現抽象產品工廠(生產小米產品族產品)
public class XiaoMiFactory implements IProductFactory {
    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaoMiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new XiaoMiRouter();
    }
}

//華爲工廠實現抽象產品工廠(生產華爲產品族產品)
public class HuaweiFactory implements IProductFactory {
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new HuaweiRouter();
    }
}

來測試一下:

public class Client {
    public static void main(String[] args) {
        System.out.println("================小米系列產品================");
        //小米工廠
        XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();

        IphoneProduct iphoneProduct = xiaoMiFactory.iphoneProduct();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();

        IRouterProduct iRouterProduct = xiaoMiFactory.routerProduct();
        iRouterProduct.openWife();

        System.out.println("================華爲系列產品================");

        HuaweiFactory huaweiFactory = new HuaweiFactory();

        iphoneProduct = huaweiFactory.iphoneProduct();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();

        iRouterProduct = huaweiFactory.routerProduct();
        iRouterProduct.openWife();
    }
}

看一下結果:

//運行結果:

================小米系列產品================
小米打電話
小米發短信
打開小米Wifi
================華爲系列產品================
華爲打電話
華爲發短信
打開華爲Wifi

看到這你已經懂抽象工廠模式了。

如果還是有點模糊,再看一遍,自己畫個圖更好理解一下!

沒有什麼是再來一遍理解不了的!

小結

抽象工廠模式不可以增加產品,可以增加產品族。

適用場景:

  • 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
  • 強調一系列相關的產品對象(屬於同意產品族)一起使用創建對象需要大量的重複代碼。
  • 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使得客戶端不依賴於具體的實現。

優點:

  • 具體產品在應用層的代碼隔離,無需關心創建的細節。
  • 將一個系列的產品統一到一起創建。

缺點:

  • 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難。
  • 增加了系統的抽象性和理解難度。

適用場景:

  • 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
  • 強調一系列相關的產品對象(屬於同意產品族)一起使用創建對象需要大量的重複代碼。
  • 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使得客戶端不依賴於具體的實現。

優點:

  • 具體產品在應用層的代碼隔離,無需關心創建的細節。
  • 將一個系列的產品統一到一起創建。

缺點:

  • 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難。
  • 增加了系統的抽象性和理解難度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章