Creational Pattern 之 Abstract Factory
啥時候你想到用Abstract Factory Pattern?
恩 ....
1 當你的系統需要獨立於產品實體的如何被創建、如何被構成、如何被展現的時候,可以考慮使用Abstract Factory Pattern.
2 一個系統需要被配置成不同family的成品, 如界面風格,motif風格、mercury風格。
3 提供一套產品的庫, 需要只對我提供構建產品的接口。
具體一點,看下面這個實例,一個銷售水果的系統,它不過水果是如何被採摘、如何包裝、如何被封箱、如何貼標籤,而只是將可以賣的成品放到櫃檯或者集市去銷售.
在這裏, 我們設計銷售水果的系統爲類AutoSaleSystem.
class AutoSaleSystem{
public:
void saleFruitToJapan() {
Package* package = new JapanPackage();
Product* productForSale = package->product();
}
}
//包裝: 標籤 尺寸 加工工藝(罐頭,乾果,鮮果)等
class Package {
virtual FruitProduct* produce() const;
}
class JapanPackage : public Package {
FruitProduct* product() const {
FruitProduct* product = new JapanFruitProduct ();
}
virtual ~JapanPackage() {}
}
class RussiaPackage : public Package {
FruitProduct* product() const {
FruitProduct* product = new RussiaFruitProduct ();
}
virtual ~ RussiaPackage () {}
}
class FruitProduct {
public:
virtual string getLabel() const;
virtual unsigned int getSize() const;
private:
string m_label;
unsigned int m_size;
}
class JapanFruitProduct : public FruitProduct {
public:
string getLabel() const {...}
unsigned int getSize() const {...}
}
class RussiaFruitProduct : public FruitProduct {
public:
string getLabel() const {...}
unsigned int getSize() const {...}
}
Abstract Factory Pattern的利與弊哈:
1 對具體的實現類進行隔離:
由於由具體的工廠來生產不同的產品,所以不同類型的產品不會混雜在一起。
2 用戶不必瞭解產品的實現細節,而可以只關心接口。
3 在不同的產品族之間切換變得方便:如saleProduct(Package*), 通過爲saleProduct傳遞不同的Package類型可以方便在Japan和Russia倆個產品族直接切換, 接口完全不用改變,改變的僅是在run-time時傳什麼具體的Package類。
4 同時,如果新加一類產品族,需要構建相關的產品類和生產該產品的具體工廠類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.