#ifndef __PROTOTYPE_H__
#define __PROTOTYPE_H__
#include <string>
//【说明】
// 通过派生类实现clone接口, 结合拷贝构造函数,可以实现复制一个同样对象的效果。
// 原型模式应用场景:1)不能根据类名来生成实例的场景 2)负责生成与某个复杂对象状态完全一样的实例。
//【定义】
// 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
//【角色】
// 1) Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。
// 2) ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
// 3) Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。
//【意义】
// 当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。
// 在代码中出现类的名字并非总是坏事,不过,一旦在代码中出现要使用的类的名字,就无法与该类分离开来,也就无法实现复用。
// 工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。
//【示例】
//标记接口,没有声明任何方法,被用来标记可以使用Clone方法进行复制
class iCloneable{};
//基类产品,提供Clone接口
class iProduct : public iCloneable
{
public:
iProduct(){ }
virtual ~iProduct(){ }
public:
virtual void Show() = 0;
virtual iProduct* Clone() = 0;
};
//具体产品,实现Clone接口和拷贝构造函数,注意浅拷贝和深拷贝
class Prototype : public iProduct
{
public:
Prototype(const std::string &name);
Prototype(const Prototype &cp);
virtual void Show();
virtual iProduct* Clone();
private:
std::string m_name;
};
void TestPrototype();
#endif
#include "Prototype.h"
Prototype::Prototype(const std::string &name)
{
m_name = name;
}
Prototype::Prototype(const Prototype &cp)
{
this->m_name = cp.m_name;
}
void Prototype::Show()
{
printf("The Product Name is %s \n", m_name.c_str());
}
iProduct* Prototype::Clone()
{
return new Prototype(*this);
}
void TestPrototype()
{
iProduct *p1 = new Prototype("AA");
p1->Show();
iProduct *p2 = p1->Clone();
p2->Show();
delete p1;
delete p2;
}