1. 意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2. 两种角色
抽象原型(Prototype)、具体原型(Concrete Prototype)
3. 优点
3.1 对客户隐藏了具体的产品类
3.2 可以在运行时刻增加和删除产品
3.3 可以极大地减少系统所需要的类的数目
3.4 改变结构可以指定新对象
3.5 可以减少子类的构造
3.6 用类动态配置应用
4. 缺点
4.1 每一个原型的子类都必须实现Clone操作
这可能很困难,当内部有不支持拷贝或循环引用的对象时。
5. 相关模式
5.1 原型和抽象工厂在某种方面是相互竞争的,但它们也可以一起使用。
抽象工厂可以存储一个被克隆的原型的集合,并且返回产品对象。
5.2 大量使用Composite和Decorator模式的设计通常可以从原型模式处获益。
6. 代码示意(C++)
#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;
}
运行结果: