設計模式C#描述——抽象原廠模式
來源:互聯網
上載者:User
設計 設計模式C#描述——抽象原廠模式
閱讀此文應先閱讀簡單原廠模式與Factory 方法模式
抽象原廠模式是對象的建立模式,它是Factory 方法模式的進一步推廣。
假設一個子系統需要一些產品對象,而這些產品又屬於一個以上的產品等級結構。那麼為了將消費這些產品對象的責任和建立這些產品對象的責任分開,可以引進抽象原廠模式。這樣的話,消費產品的客戶不需要直接參与產品的建立工作,而只需要向一個公用的工廠介面請求所需要的產品。
採用抽象原廠模式設計出的系統類別圖如下。
從上圖可以看到,抽象原廠模式設計到以下的角色:
抽象工廠角色:擔任這個角色的是Factory 方法模式的核心,它是與應用系統的商業邏輯無關的。通常使用介面或抽象類別實現。
具體工廠角色:這個角色直接在用戶端的調用下建立產品的執行個體。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。通常使用具體的類實現。
抽象產品角色:擔任這個角色的類是抽象Factory 方法模式所建立的對象的父類,或它們共同擁有的介面。通常使用介面或抽象類別實現這一角色。
具體產品角色:抽象原廠模式所建立的任何產品對象都是某一具體產品類的執行個體。這是用戶端最終需要的東西。通常使用具體類實現這個角色。
下面給出這個系統的原代碼:
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()
{
}
}
在以下情況下應該使用抽象原廠模式:
一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有形態的原廠模式都是重要的。
這個系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現。