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 同时,如果新加一类产品族,需要构建相关的产品类和生产该产品的具体工厂类。