由AF再论template的再考虑

本文介绍了一种使用模板方法实现的原型工厂模式,通过保存原型对象并进行克隆来创建新的对象实例,避免了传统new操作符的直接使用,同时保持了代码的灵活性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_;
}

和使用new一样,不过此时需要有一个预先设定 ConcreteProduct供产出产品。所以有了几个辅助方法。

你可能已经发现了,这个时候再使用ConcreteFactory不再需要TList,因为正确的PrototypeFactoryUnit知道该产生什么,它甚至不关心它正在操作的类型是什么。

当然,在获取产品的时候,你的代码不需要任何改变:

    SmartPtr<Test2>    t2    = pKit->Create<Test2>();

这不是为了照顾使用者,尽管特定的Creator不需要知道类型,但是找到这个特定Creator的方法却非常需要这个类型信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值