閱讀此文應先閱讀簡單工廠模式與工廠方法模式
抽象工廠模式是對象的創建模式,它是工廠方法模式的進一步推廣。
假設一個子系統需要一些產品對象,而這些產品又屬於一個以上的產品等級結構。那麼為了將消費這些產品對象的責任和創建這些產品對象的責任分開,可以引進抽象工廠模式。這樣的話,消費產品的客戶不需要直接參與產品的創建工作,而只需要向一個公用的工廠接口請求所需要的產品。
抽象工廠角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統的商業邏輯無關的。通常使用接口或抽象類實現。
具體工廠角色:這個角色直接在客戶端的調用下創建產品的實例。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。通常使用具體的類實現。
抽象產品角色:擔任這個角色的類是抽象工廠方法模式所創建的對象的父類,或它們共同擁有的接口。通常使用接口或抽象類實現這一角色。
具體產品角色:抽象工廠模式所創建的任何產品對象都是某一具體產品類的實例。這是客戶端最終需要的東西。通常使用具體類實現這個角色。
下面給出這個系統的原代碼:
Creator:
public interface Creator
{
ProductA factoryA();
ProductB factoryB();
}
ConcreteCreator1:
public class ConcreteCreator1:Creator
{
public ProductA factoryA()
{
return new ProductA1();
}
public ProductB factoryB()
{
return new ProductB1();
}
}
ConcreteCreator2:
public class ConcreteCreator2:Creator
{
public ProductA factoryA()
{
return new ProductA2();
}
public ProductB factoryB()
{
return new ProductB2();
}
}
ProductA:
public interface ProductA
{
}
ProductA1:
public class ProductA1:ProductA
{
public ProductA1()
{
}
}
ProductA2:
public class ProductA2:ProductA
{
public ProductA2()
{
}
}
ProductB:
public interface ProductB
{
}
ProductB1:
public class ProductB1:ProductB
{
public ProductB1()
{
}
}
ProductB2:
public class ProductB2:ProductB
{
public ProductB2()
{
}
}
在以下情況下應該使用抽象工廠模式:
一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
這個系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。