設計模式(3)-抽象工廠模式詳解(易懂)

秦子帥發表於2018-01-05

抽象工廠模式定義

抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,建立多個產品族中的產品物件。

這裡新增一個概念,**產品族:**是指位於不同產品等級結構中,功能相關聯的產品組成的家族。一般是位於不同的等級結構中的相同位置上。顯然,每一個產品族中含有產品的數目,與產品等級結構的數目是相等的,形成一個二維的座標系,水平座標是產品等級結構,縱座標是產品族。叫做相圖。

image


抽象工廠模式與工廠方法模式的區別

工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構,所以有個產品族的概念。在程式設計中,通常一個產品結構,表現為一個介面或者抽象類,也就是說,工廠方法模式中的所有產品都是來自同一個介面或抽象類,而抽象工廠模式中的產品則是來自不同的介面或抽象類。

抽象工廠模式是工廠方法模式的升級版本,在有多個業務,或者多個分類的情況下,抽象工廠模式比較適合。

前幾天我寫了工廠方法模式的文章,設計模式(2)-工廠方法模式詳解(易懂)

文章裡舉例了手機工廠生產手機的例子,我們繼續用這個例子來分析這兩個模式。

首先來回憶一下工廠方法模式的例子:一個手機工廠生產華為和小米兩種手機,模型圖如下:

image

從模型上可以發現,兩種手機在一個等級結構,也就是都實現或者整合了同一個介面或抽象類。

還以手機為例,現在加入了手機尺寸的要求,模型如下:

image

首先要知道一個概念,產品族,文章開頭我已經定義了。

從上面模型可以發現:

6.0英寸華為手機A1與6.0英寸的小米手機B1屬於一個產品族,5.5英寸華為手機A2與5.5英寸小米手機B2屬於一個產品族;Factory1表示生產6.0英寸的手機,Factory2表示生產5.5英寸的手機。

抽象工廠模式中的抽象工廠類中的建立方法與產品族的個數有關。

有N個產品等級結構就會有N個實現工廠類。


抽象工廠模式程式碼演示

我們拿上面的抽象工廠例項模型舉例:

1.首先看一下兩種手機的抽象產品類:

public abstract class AbstractHUAWEI {
   //華為手機共同的方法,比如品牌
     public void commonMethod(){

     }
//相同的方法,不同的實現。比如尺寸,型號等等
     public abstract  void  dosomething();
}
複製程式碼
public abstract class AbstractMI {
   //小米手機共同的方法,比如品牌
   public void commonMethod(){

   }
   //相同的方法,不同的實現。比如尺寸,型號等等
   public abstract  void  dosomething();
}

複製程式碼

2.兩種手機對應的產品實現類

public class HUAWEI_A1 extends AbstractHUAWEI{
   @Override
   public void dosomething() {
       Log.i("qzs","我是6.0英寸的華為手機A1");
   }
}

public class HUAWEI_A2 extends AbstractHUAWEI {
   @Override
   public void dosomething() {
       Log.i("qzs","我是5.5英寸的華為手機A2");
   }
}

public class MI_B1 extends AbstractMI {
   @Override
   public void dosomething() {
       Log.i("qzs","我是6.0英寸的小米手機B1");
   }
}

public class MI_B2 extends AbstractMI {
   @Override
   public void dosomething() {
       Log.i("qzs","我是5.5英寸的小米手機B1");
   }
}

複製程式碼

3.抽象工廠類

public abstract class AbstractFactory  {
   //6.0英寸手機
     public abstract  AbstractHUAWEI createSize1();

   //5.5英寸手機
     public abstract  AbstractMI createSize2();
}

複製程式碼

4.兩個工廠實現類


public class Factory1 extends AbstractFactory {
   @Override
   public AbstractHUAWEI createSize1() {
       return new HUAWEI_A1();
   }

   @Override
   public AbstractMI createSize2() {
       return new MI_B1();
   }
}

複製程式碼
public class Factory2 extends AbstractFactory {
   @Override
   public AbstractHUAWEI createSize1() {
       return new HUAWEI_A2();
   }

   @Override
   public AbstractMI createSize2() {
       return new MI_B2();
   }
}
複製程式碼

5.呼叫


       AbstractFactory factory1=new Factory1();
       AbstractFactory factory2=new Factory2();
       //生產A1
       AbstractHUAWEI a1=factory1.createHUAWEI();
    //   a1.dosomething();
       //生產A2
       AbstractHUAWEI a2=factory2.createHUAWEI();
      // a2.dosomething();
       //生產B1
       AbstractMI b1=factory1.createMI();
     //  b1.dosomething();
       //生產B2
       AbstractMI b2=factory2.createMI();
    //   b2.dosomething();

複製程式碼

從呼叫類可以看出,建立的生產物件過程與實現類無關。


抽象工廠模式的優缺點

1.優點

  • 隔離了具體類(從呼叫類的程式碼可以看出),非公開。

  • 增加產品下的系列也就是增加具體的實現工廠類很方便,符合“開閉原則”(比如上面的例子中我在兩種手機下又新增了一個5.0英寸的,直接加一個新的具體工廠類就可以了)

2.缺點

  • 抽象工廠模式的產品族擴充套件是很難的,拿上面的手機舉例,如果我增加個一個手機品牌OPPO,那麼由兩個品牌變成三個品牌,試試改一下會發現:首先要更改抽象工廠類,然後會發現所有的類基本上都跟著動了。改變了抽象類和介面,這是大忌!

  • 類檔案增加過快

參考資料《大話設計模式》《設計模式之禪》 歡迎大家關注我的微信公眾號:安卓乾貨鋪

image

相關文章