1. 程式人生 > >設計模式 _第三招式_抽象工廠模式

設計模式 _第三招式_抽象工廠模式

一、定義
抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,為建立一組相關或互相依賴的物件介面,而且無需指定他們的具體類。

二、程式碼演示
抽象工廠模式的通用類圖如下:
這裡寫圖片描述
抽象工廠模式是工廠方法模式的升級版本,在多個業務品種、業務分類時,通過抽象工廠模式產生類是一種非常好的解決方式。我們來看看抽象工廠的通用原始碼,首先有兩個相互影響的產品線,例如製造汽車的左側門和右側門,兩個應該數量是相等的–兩個物件之間的約束,每個型號和車門都是不一樣的,這是產品等級結構約束的,先看看兩個產品族的類圖:
這裡寫圖片描述

  • 抽象產品類
public
abstract class AbstractProductA { //每個產品共有的方法 public void shareMethod(){ } //每個產品相同的方法不同的實現 public void doSomething(){ } } public abstract class AbstractProductB { //每個產品共有的方法 public void shareMethod(){ } //每個產品相同的方法不同的實現 public void doSomething(){ } }
  • 產品A1的實現類
public class ProductA1 extends AbstractProductA {
    public void  doSomething(){
        System.out.println("產品A1的實現方法");
    }
}
  • 產品B1的實現類
public class ProductB1 extends AbstractProductB {
    public void  doSomething(){
        System.out.println("產品B1的實現方法");
    }
}
  • 抽象工廠類

抽象工廠類AbsractCreator的職責是定義每個工廠要實現的功能,在通用程式碼中,抽象工廠類定義了兩個產品族的產品建立

public abstract class AbstractCreator {
    //建立A產品家族
    public abstract  AbstractProductA createProductA();
    //建立B產品家族
    public abstract  AbstractProductB createProductB();
}
  • 產品等級1的實現類A產品\產品等級1的實現類B產品
public class Creator1 extends AbstractCreator {
    //只生產等級為1的A產品
    public   AbstractProductA createProductA(){
        return  new ProductA1();
    }
    //只生產等級為1的A產品
    public   AbstractProductB createProductB(){
        return  new ProductB1();
    }
}
  • 場景類
    在場景中,沒有任何一個方法與實現類有關係,對於一個產品來說,我們只要知道它的工廠方法就可以直接產生一個產品物件,無限關心它的實現類。
public class Client {
    public  static  void  main(String args[]){
        AbstractCreator  creator1= new Creator1();
        //產生A1物件
        AbstractProductA  a1 = creator1.createProductA() ;
        a1.doSomething();
        //產生B1物件
        AbstractProductB  b1 = creator1.createProductB() ;
        b1.doSomething();
    }
}

三、優點
封裝性,每個產品的實現類不是高層模組要關心的, 它要關心的是介面,是抽象,它不關心物件是怎麼建立的。只要知道工廠類就可以建立一個需要的物件。
產品族的約束為非公開狀態。具體的產品族約束是在工廠類中實現的。

四、缺點
抽象工廠模式最大的缺點是產品族擴充套件非常困難。例如要增加一個產品C,也就是示例中的產品族由兩個變為了三個,看看我們程式需要做如下改動。抽象類AbstractCreator 需要增加createProductC(),然後兩個實現類要修改,這嚴重違反了開閉原則。做修改的時候可能影響老的業務邏輯。

五、應用場景
一個物件族都有相同的約束,則可以使用抽象工廠模式。例如:我們可以用抽象工廠模式,產生不同作業系統系的編輯器和圖片處理器。
六、注意事項
雖然抽象工廠模式的產品族擴充套件比較困難,但是產品級別是非常容易擴充套件,增加一個產品等級,只是增加一個工廠類負責新增加出來的產品生產任務即可。也就是說,橫向擴充套件容易,縱向擴充套件困難。