設計模式 _第三招式_抽象工廠模式
一、定義
抽象工廠模式(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(),然後兩個實現類要修改,這嚴重違反了開閉原則。做修改的時候可能影響老的業務邏輯。
五、應用場景
一個物件族都有相同的約束,則可以使用抽象工廠模式。例如:我們可以用抽象工廠模式,產生不同作業系統系的編輯器和圖片處理器。
六、注意事項
雖然抽象工廠模式的產品族擴充套件比較困難,但是產品級別是非常容易擴充套件,增加一個產品等級,只是增加一個工廠類負責新增加出來的產品生產任務即可。也就是說,橫向擴充套件容易,縱向擴充套件困難。