c++设计模式之原型模式(protoptype)

来源:互联网 发布:软件设计师考试教程 编辑:程序博客网 时间:2024/06/03 21:57
1. 标准定义
原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2. 分析和说明
原型模式是指用原型实例指定创建对象的种类,并且通过拷贝(克隆)这些原型创建新的对象。原型模式也是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类是在运行时刻指定时,可使用原型模式。原始模型模式适用于任何的等级结构。
原型模式的缺点是每一个类都必须配备一个克隆方法。Prototype的角色包括客户(Client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。Prototype用来声明一个拷贝自身的接口,ConcretePrototype用来实现一个拷贝自身的操作;Client用来让一个原型拷贝自身从而创建一个新的对象
客户(Client)角色:客户类提出创建对象的请求。抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
3.常用场景
基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。
4.优点
1.使用拷贝模式比直接new一个对象的开销要小的多。
2.可以在程序运行时(对象属性发生了变化),得到一份内容相同的实例,但之间还不会相互干扰。
5.C++代码实现:
#include <iostream>
#include <string>
using namespace std;


//抽象基类
class Prototype{ 
private:
string strName;
public: 
Prototype() //默认构造 

strName = "empty!"; 
}
Prototype(string strName)//拷贝构造 

this->strName = strName; 
}
void Show() 
{
cout<<":"<<strName<<endl;
}
virtual Prototype* Clone() = 0 ; //定义Clone接口,根据不同的派生类来实例化对象
virtual ~Prototype()
{
cout<<"~Prototype!"<<endl;

} ; 


//具体ConcretePrototype1 
class ConcretePrototype1 : public Prototype { 
public: 
ConcretePrototype1(string strName) : Prototype(strName)
{

}
ConcretePrototype1()
{

}
virtual Prototype* Clone() 

ConcretePrototype1 *p = new ConcretePrototype1() ; 
*p = *this ; //复制对象 
return p ; 

virtual ~ConcretePrototype1()
{
cout<<"~ConcretePrototype1!"<<endl;
}
} ; 


//具体ConcretePrototype2 
class ConcretePrototype2 : public Prototype { 
public: 
ConcretePrototype2(string strName) : Prototype(strName)
{

}
ConcretePrototype2()
{

}
virtual Prototype* Clone() 

ConcretePrototype2 *p = new ConcretePrototype2() ; 
*p = *this ; //复制对象 
return p ; 

virtual ~ConcretePrototype2()
{
cout<<"~ConcretePrototype2!"<<endl;
}
} ; 


//客户端
int main(void)
{
/*原型模式作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype模式重在从自身复制自己创建新类,隐藏(不需知道)对象创建的细节*/ 
/*1、用原型实例p1指定创建对象的种类ConcretePrototype1 */
ConcretePrototype1* p1 = new ConcretePrototype1("A");
/*2、通过拷贝这些原型创建新的对象 */
ConcretePrototype2* p2 = (ConcretePrototype2*)p1->Clone();
p1->Show();
p2->Show();
delete p1;
delete p2;
return 0;
}

0 0
原创粉丝点击