设计模式之Prototype

 

设计模式之Prototype(原型)

原文:http://www.vincehuston.org/dp/prototype.html

定义:

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

Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

1.  在基类接口中定义一个clone()方法,并在每一个派生类中实现这个方法。

2.  每一个实现都通过封装”new”操作并返回自己的实例。

3.  客户端委托给原型对象来创建对象。


/  A clone() method has been added to the Stooge
//  hierarchy.  Each derived class implements that
//  method by returning an instance of itself.  A
//  Factory class has been introduced that main-
//  tains a suite of "breeder" objects (aka proto-
//  types), and knows how to delegate to the
//  correct prototype.

class  Stooge  {
public:
   
virtual Stooge* clone() = 0;
   
virtual void slap_stick() = 0;
}
;

class  Factory  {
public:
   
static Stooge* make_stooge( int choice );
private:
   
static Stooge* s_prototypes[4];
}
;

int  main(  void  )  {
   vector roles;
   
int             choice;

   
while (true{
      cout 
<< "Larry(1) Moe(2) Curly(3) Go(0): ";
      cin 
>> choice;
      
if (choice == 0)
         
break;
      roles.push_back(
         Factory::make_stooge( choice ) );
   }


   
for (int i=0; i < roles.size(); ++i)
      roles[i]
->slap_stick();
   
for (int i=0; i < roles.size(); ++i)
      delete roles[i];
}


class  Larry :  public  Stooge  {
public:
   Stooge
*   clone() return new Larry; }
   
void slap_stick() {
      cout 
<< "Larry: poke eyes "; }

}
;
class  Moe :  public  Stooge  {
public:
   Stooge
*   clone() return new Moe; }
   
void slap_stick() {
      cout 
<< "Moe: slap head "; }

}
;
class  Curly :  public  Stooge  {
public:
   Stooge
*   clone() return new Curly; }
   
void slap_stick() {
      cout 
<< "Curly: suffer abuse "; }

}
;

Stooge
*  Factory::s_prototypes[]  =   {
   
0new Larry, new Moe, new Curly
}
;
Stooge
*  Factory::make_stooge(  int  choice )  {
   
return s_prototypes[choice]->clone();
}

1.Composite and Decorator patterns都得益于原型模式。

2.当对象初始化时会花费更多代价的时候,原型是很有用的,你会在初始化参数中使用很少的变量

在此背景下,原型会避免“从0开始创建“这种昂贵的代价,并支持廉价克隆一个预初始化原型。

3.相对于其他模式,原型模式是独一无二的,它并不需要一个类,只需要一个对象。就像oo语言一样,Omega打破了类完全依靠原型来创建对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值