設計模式:抽象工廠模式
定義
抽象工廠模式標準定義:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(爲創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。)
結構類圖
抽象工廠模式包含如下角色:
AbstractFactory:抽象工廠
ConcreteFactory:具體工廠
AbstractProduct:抽象產品
Product:具體產品
抽象工廠模式的使用場景是,系統中有多個產品族,同一個產品族中的產品將一起使用。
如圖,產品等級爲1的產品族,生產等級爲1的全部產品。
產品等級爲2的產品族,生產等級爲2的全部產品。
代碼
抽象產品類A:
public abstract class AbstractProductA {
// 每個產品共有的方法
public void shareMethod() {
}
// 每個產品相同方法,不同實現
public abstract void doSomething();
}
產品A1的實現類:
public class ProductA1 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("產品A1的實現方法");
}
}
產品A2的實現類:
public class ProductA2 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("產品A2的實現方法");
}
}
抽象產品類B:
public abstract class AbstractProductB {
// 每個產品共有的方法
public void shareMethod() {
}
// 每個產品相同方法,不同實現
public abstract void doSomething();
}
產品B1的實現類:
public class ProductB1 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("產品B1的實現方法");
}
}
產品B2的實現類:
public class ProductB2 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("產品B2的實現方法");
}
}
抽象工廠類AbstractCreator定義每個工廠要實現的功能,在同一個產品族中有多少類產品,就需要定義多少個創建方法。在通用代碼中,抽象工廠類定義了A、B兩種產品的產品創建:
/*
* 抽象工廠類
*/
public abstract class AbstractCreator {
// 創建A產品
public abstract AbstractProductA createProductA();
// 創建B產品
public abstract AbstractProductB createProductB();
}
下面來看具體的實現類。有多少個產品族,就有多少個工廠實現類。
產品等級1的實現類:
public class Creator1 extends AbstractCreator {
// 只生產產品等級爲1的A產品
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
// 只生產產品等級爲1的B產品
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
產品等級2的實現類:
public class Creator2 extends AbstractCreator {
// 只生產產品等級爲2的A產品
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
// 只生產產品等級爲2的B產品
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
場景類:
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();
/*
* 然後在這裏就可以爲所欲爲了...
*/
}
}
優點
- 抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易。
- 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。
- 增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。
缺點
- 在添加新的產品對象時,將涉及到對抽象工廠角色及其所有子類的修改,會帶來很大不便。
- 開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品結構麻煩)。
抽象工廠、工廠方法、簡單工廠
- 抽象工廠:一個抽象工廠接口,多個工廠實現類
- 工廠方法:一個抽象工廠接口,一個工廠實現類
- 簡單工廠:一個擁有靜態工廠方法的工廠類
當抽象工廠模式中每一個具體工廠類只創建一個產品對象,也就是隻存在一個產品等級結構時,抽象工廠模式退化成工廠方法模式;當工廠方法模式中抽象工廠與具體工廠合併,提供一個統一的工廠來創建產品對象,並將創建對象的工廠方法設計爲靜態方法時,工廠方法模式退化成簡單工廠模式。