AF模式运行使用任何实现方法,只要AbstractFactory被完全实现。那开发一个原型产品工厂完全不用修改底层的东西。
使用template的本质论。如果我们开发原型工厂,那在new对象的时候要换成原型的拷贝,明显,保存一个原型是解决这个问题的核心,如此则有:
template
<
class
ConcreteProduct,
class
Base
>
class PrototypeFactoryUnit : public Base
... {
public:
PrototypeFactoryUnit(ConcreteProduct* p = 0) :pPrototype_(p)...{}
ConcreteProduct* GetPrototype() const ...{return pPrototype_;}
void SetPrototype(ConcreteProduct* pObj) ...{pPrototype_ = pObj;}
ConcreteProduct* DoCreate(Type2Type<ConcreteProduct>)
...{
assert(pPrototype_);
return pPrototype_->Clone();
}
private:
ConcreteProduct* pPrototype_;
}
class PrototypeFactoryUnit : public Base
... {
public:
PrototypeFactoryUnit(ConcreteProduct* p = 0) :pPrototype_(p)...{}
ConcreteProduct* GetPrototype() const ...{return pPrototype_;}
void SetPrototype(ConcreteProduct* pObj) ...{pPrototype_ = pObj;}
ConcreteProduct* DoCreate(Type2Type<ConcreteProduct>)
...{
assert(pPrototype_);
return pPrototype_->Clone();
}
private:
ConcreteProduct* pPrototype_;
}
和使用new一样,不过此时需要有一个预先设定 ConcreteProduct供产出产品。所以有了几个辅助方法。
你可能已经发现了,这个时候再使用ConcreteFactory不再需要TList,因为正确的PrototypeFactoryUnit知道该产生什么,它甚至不关心它正在操作的类型是什么。
当然,在获取产品的时候,你的代码不需要任何改变:
SmartPtr
<
Test2
>
t2
=
pKit
->
Create
<
Test2
>
();
这不是为了照顾使用者,尽管特定的Creator不需要知道类型,但是找到这个特定Creator的方法却非常需要这个类型信息。