? ? 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
? ? 抽象原型(Prototype)、具体原型(Concrete Prototype)
? ? 3.1 对客户隐藏了具体的产品类
? ? 3.2 可以在运行时刻增加和删除产品
? ? 3.3 可以极大地减少系统所需要的类的数目
? ? 3.4 改变结构可以指定新对象
? ? 3.5 可以减少子类的构造
? ? 3.6 用类动态配置应用
? ? 4.1 每一个原型的子类都必须实现Clone操作
? ? ? ? ? ?这可能很困难,当内部有不支持拷贝或循环引用的对象时。
? ? 5.1 原型和抽象工厂在某种方面是相互竞争的,但它们也可以一起使用。
? ? ? ? ? 抽象工厂可以存储一个被克隆的原型的集合,并且返回产品对象。
? ? 5.2 大量使用Composite和Decorator模式的设计通常可以从原型模式处获益。
#pragma once
#include<iostream>
#include <string>
using namespace std;
class Prototype
{
protected:
string m_strName;
public:
Prototype(){}
Prototype(const string &strName)
{
m_strName = strName;
}
void Show()
{
cout << m_strName << endl;
}
public:
virtual Prototype* Clone() = 0;
};
class ConcretePrototype1 : public Prototype
{
public:
ConcretePrototype1(const string &strName) : Prototype(strName) {}
ConcretePrototype1(const ConcretePrototype1 &other)
{
m_strName = "Copy_" + other.m_strName;
}
public:
virtual Prototype* Clone()
{
return new ConcretePrototype1(*this);
}
};
class ConcretePrototype2 : public Prototype
{
public:
ConcretePrototype2(const string &strName) : Prototype(strName) {}
ConcretePrototype2(const ConcretePrototype2 &other)
{
m_strName = "Copy_"+other.m_strName;
}
public:
virtual Prototype* Clone()
{
return new ConcretePrototype2(*this);
}
};
#include "ProtoType.h"
int main() {
Prototype* pPrototype1 = new ConcretePrototype1("ConcretePrototype1");
pPrototype1->Show();
Prototype* pPrototype2 = pPrototype1->Clone();
pPrototype2->Show();
delete pPrototype1;
delete pPrototype2;
return 0;
}
运行结果: