设计模式--创建型-Prototype(原形)

 

设计模式--创建型-Prototype(原形)

 

 

 

1.意图

 

用原形实例指定创建对象的种类,并且通过拷贝这些原形创建新的对象。

 

 

 

2. 结构图

 

 

 

 

3. 简述

 

在一个特定的场景中经常需要出现多个相同但状态(种类)各异的对象,通常的解决方法是使用原形模式,从已有的对象拷贝出新的对象,这样可以减少客户知道的类的名字数目。

对Client程序来说,原型和抽象工厂的类似,只是内部的CreateProductA等不是每次都简单的new一个实例,而是用已有的原形实例去克隆一个新实例。

 

 

 

4.实例代码

 

4.1 对外的接口的定义,给客户Client使用

class PrototypeA

{

     int  _type;

 

public:

     PrototypeA() {}

     PrototypeA( const PrototypeA& other){ /*深拷贝*/ }

     virtual ~PrototypeA(){}

 

     virtual PrototypeA*Clone() { returnnew PrototypeA(*this); }

     virtual void Init( int nType ) { _type= nType; }

     virtual void FunA() {}

};

 

class PrototypeB

{

public:

     PrototypeB() {}

     PrototypeB( const PrototypeB& other){ /*深拷贝*/ }

     virtual ~PrototypeB(){}

 

     virtual PrototypeB*Clone() { returnnew PrototypeB(*this); }

     virtual void FunB() {}

};

 

class PrototypeFactory

{

     PrototypeA*   _prototypeA;

     PrototypeB*   _prototypeB;

 

public:

     PrototypeFactory( PrototypeA*pA, PrototypeB*pB )

         : _prototypeA(pA),

         _prototypeB(pB){}

 

     PrototypeA* CreatePrototypeA_Type1()

     {

         PrototypeA* pA= _prototypeA->Clone();

         pA->Init(1);

         return pA;

     }

 

     PrototypeA* CreatePrototypeA_Type2()

     {

         PrototypeA* pA= _prototypeA->Clone();

         pA->Init(2);

         return pA;

     }

 

     PrototypeB* CreatePrototypeB()

     {

         return _prototypeB->Clone();

     }

};


 

 

 

4.3 客户Client程序

 

可以对原形进行集成扩展:

 

class ConcretePrototypeB : public PrototypeB

{

public:

     ConcretePrototypeB() {}

     ConcretePrototypeB( constConcretePrototypeB& other ){ /*深拷贝*/ }

     ~ConcretePrototypeB() {}

 

     PrototypeB* Clone(){ return new ConcretePrototypeB(*this);}

     void FunB() {}

};

 

 

int main()

{

     PrototypeFactory factory(new PrototypeA,new ConcretePrototypeB);

     PrototypeA* pProA1= factory.CreatePrototypeA_Type1();

     pProA1->FunA();

 

     PrototypeA* pProA2= factory.CreatePrototypeA_Type2();

     pProA2->FunA();

 

     PrototypeB* pProB= factory.CreatePrototypeB();

     pProB->FunB();

 

     delete pProA1;

     delete pProA2;

     delete pProB;

}


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值