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;
}
原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
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;
}