抽象工廠模式
一、定義
爲創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類
抽象工廠方法的通用類圖如下
抽象工廠模式是工廠方法模式的升級版本,應用於多個業務品種、業務分類產生對象的情況。
下面爲通用源代碼類圖與其代碼
通用源代碼類圖
有兩個相互影響的產品線(產品族,即不同的產品,如汽車發動機和方向盤)ProductA、ProductB
,每個產品有連個登記,ProductX1、ProductX2,有2個工廠類Creator1、Creator2用於創建來個等級的產品,Creator1生產
抽象產品類ProductA1、ProductB1,所以Creator1依賴ProductA1、ProductB1,Creator2同樣。
通用源碼
public abstract class AbstractProductA {
//每個產品共有的方法
public void shareMethod(){
}
//每個產品相同方法,不同實現
public abstract void doSomething();
}
產品A1的實現類
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("產品A1的實現方法");
}
}
產品A2的實現方式
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("產品A2的實現方法");
}
}
產品B與A類似
抽象工廠類AbstractCreator的職責是定義每個工廠要實現的功能
public abstract class AbstractCreator {
//創建A產品家族
public abstract AbstractProductA createProductA();
//創建B產品家族
public abstract AbstractProductB createProductB();
}
等級爲1的工廠類
public class Creator1 extends AbstractCreator {
//只生產產品等級爲1的A產品
public AbstractProductA createProductA() {
return new ProductA1();
}
//只生產產品等級爲1的B產品
public AbstractProductB createProductB() {
return new ProductB1();
}
}
等級爲2的工廠類
public class Creator2 extends AbstractCreator {
//只生產產品等級爲2的A產品
public AbstractProductA createProductA() {
return new ProductA2();
}
//只生產產品等級爲2的B產品
public AbstractProductB createProductB() {
return new ProductB2();
}
}
與實現無關的場景類Client
public class Client {
public static void main(String[] args) {
//定義出兩個工廠
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//產生A1對象
AbstractProductA a1 = creator1.createProductA();
//產生A2對象
AbstractProductA a2 = creator2.createProductA();
//產生B1對象
AbstractProductB b1 = creator1.createProductB();
//產生B2對象
AbstractProductB b2 = creator2.createProductB();
/*
* 然後在這裏就可以爲所欲爲了...
*/
}
}
在場景類中,沒有任何一個方法與實現類有關係,我們只要知道它的工廠方法就可以直接產生一個產品對象,無須關心它的實現類。
二、抽象工廠的優點
-
封裝性
高層模塊不需要關心每個產品的實現類,只要知道哪個工廠類能創建出一個需要的對象即可
-
產品族內的約束爲非公開狀態
例如一個發動機對應一個方向盤,但需要對應四個輪子,具體的產品族內的約束是在工廠內實現的。
三、抽象工廠的缺點
-
產品族擴展困難
如上面要增加一個產品C,則需要在抽象類AbstractCreator增加一個createProductC(),然後兩個工廠實現類都需要修改,所有與契約有關係的代碼都要修改。
其實上面與現實相似,比如說一個工廠有兩個電腦生產工廠,生產電腦外殼和電池,現在老闆要擴展生產線,生產電腦藍牙設備,那麼每個工廠都要添加生產藍牙設備的車間(生產方法),這樣一個工廠產出的物品纔是完整地(在一個工廠需要產出組合完整地產品的前提下)
四、使用場景
一個對象族都有相同的約束,就可以使用抽象工廠模式。
生產工廠,生產電腦外殼和電池,現在老闆要擴展生產線,生產電腦藍牙設備,那麼每個工廠都要添加生產藍牙設備的車間(生產方法),這樣一個工廠產出的物品纔是完整地(在一個工廠需要產出組合完整地產品的前提下)