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

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

原型模式Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过显式的实例化过程。原型模式通过克隆(clone)已有对象来创建新对象,从而避免了使用传统的构造函数创建对象的开销。 在C++中,原型模式可以通过实现一个可克隆接口(通常称为原型接口)来实现。这个接口通常包含一个克隆方法,用于复制当前对象并返回一个新的副本。派生类可以实现这个接口来定义自己的克隆逻辑。 以下是原型模式的一般实现步骤: 1. 创建一个原型接口(或基类): ``` class Prototype { public: virtual Prototype* clone() const = 0; virtual void setAttributes(...) = 0; virtual void print() const = 0; }; ``` 2. 实现原型接口的具体类(或派生类): ``` class ConcretePrototype : public Prototype { private: // 在派生类中定义特定的属性 // ... public: Prototype* clone() const override { return new ConcretePrototype(*this); } void setAttributes(...) override { // 设置属性值 } void print() const override { // 打印属性值 } }; ``` 3. 在客户端代码中使用原型模式: ``` Prototype* original = new ConcretePrototype(); original->setAttributes(...); Prototype* clone = original->clone(); clone->print(); delete original; delete clone; ``` 通过使用原型模式,我们可以避免在每次创建对象时重复执行初始化的过程,提高了对象的创建效率。此外,原型模式还允许我们在运行时动态地添加或删除对象的属性,并通过克隆来创建新对象。 需要注意的是,在实现原型类时,需要确保所有成员变量都能正确地被拷贝(或克隆)。有时候可能需要自定义拷贝构造函数和赋值运算符来实现深拷贝,以避免浅拷贝带来的问题。 总结起来,原型模式通过克隆已有对象来创建新对象,提供了一种简单且灵活的对象创建方式。它适用于那些对象的创建过程比较复杂或开销较大的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值