抽象工廠模式
之前我們瞭解了簡單工廠模式和工廠方法模式,那麼在工廠模式族中還有一個抽象工廠模式(Abstract Factory Pattern)。
抽象工廠模式的介紹
抽象工廠模式是一種比較常用的模式,定義如下:
爲創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類
抽象工廠模式常用來解決一系列具有相關約束的產品族生成的問題,和工廠方法模式的相比,抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方法。
模式組成
抽象工廠模式的通用類圖如下:
下面的類圖是抽象工廠模式的通用源碼類圖:
角色 | 關係 | 作用 |
---|---|---|
AbstractProductA(抽象產品類) | 具體產品族A的父類 | 描述產品族A的公共接口 |
AbstractProductB(抽象產品類) | 具體產品族B的父類 | 描述產品族B的公共接口 |
ProductA1(具體產品) | 抽象產品A的子類 | 描述具體生產的產品 |
ProductA2(具體產品) | 抽象產品A的子類 | 描述具體生產的產品 |
ProductB1(具體產品) | 抽象產品B的子類 | 描述具體生產的產品 |
ProductB2(具體產品) | 抽象產品B的子類 | 描述具體生產的產品 |
AbstractCreator(抽象工廠類) | 具體工廠的父類 | 描述具體工廠的公共接口 |
Creator(具體工廠類) | 具體工廠 | 描述具體工廠 |
表述代碼
首先我們需要聲明抽象產品類族(A和B)
public abstract class AbstractProductA {
//每個產品共有的方法
public void shareMethod() {
}
//每個產品相同的方法,不同實現
public abstract void doSomething();
}
public abstract class AbstractProductB {
//每個產品共有的方法
public void shareMethod() {
}
//每個產品相同的方法,不同實現
public abstract void doSomething();
}
在每一個抽象產品類族中,都有不同的產品等級分類,對於產品等級,我們實現相關的具體產品類
public class ProductA1 extends AbstractProductA {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("產品A1的實習方法");
}
}
public class ProductA2 extends AbstractProductA {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("產品A2的實現方法");
}
}
public class ProductB1 extends AbstractProductB {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("產品B1的實現方法");
}
}
public class ProductB2 extends AbstractProductB {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("產品B2的生產方法");
}
}
聲明抽象工廠類:
/**
* 抽象工廠類
* @author lishanlei
*
*/
public abstract class AbstractCreator {
//創建A產品家族
public abstract AbstractProductA createProductA();
//創建B產品家族
public abstract AbstractProductB createProductB();
}
對於每個產品等級,實現一個具體的工廠類:
產品等級1的實現類
/**
* 產品等級1的實現類
* @author lishanlei
*
*/
public class Creator1 extends AbstractCreator {
//只生產產品等級爲1的A產品
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA1();
}
//只生產產品等級爲1的B產品
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
產品等級2的實現類:
/**
* 產品等級爲2的實現類
* @author lishanlei
*
*/
public class Creator2 extends AbstractCreator {
//只生產產品等級爲2的A產品
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA2();
}
//只生產產品等級爲2的B產品
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
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();
}
}
注意事項
- 有N個產品族,在抽象工廠類中就應該有N個創建方法
- 有M個產品等級就應該有M個實現工廠類,在每個實現工廠類中,實現不同產品族的生產任務
抽象工廠模式的優點
- 封裝性,每個產品的實現類不是高層模塊要關心的
- 產品族內的約束爲非公開狀態,具體的產品族內的約束是在工廠內實現的
抽象工廠模式的缺點
- 產品族的擴展非常困難(注意:不是產品等級擴展困難)
使用場景
- 一個對象族都有相同的約束,則可以使用抽象工廠模式