原型模式(Prototype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
理解
在你新创建一个实例时需要消耗较多的资源,并且希望保存已经存在的实例的状态,这时可使用原型模式.被复制的原型类需要实现拷贝构造函数,常常和工厂模式搭配使用.和单例模式相冲突.
优点
可以不再进行重复的操作以保证新的实例与已经存在的实例有相同的状态.
缺点
逃脱了构造函数的限制,这使得即使构造函数是私有方法也会存在不止一个实例出现的情况.
实现
在画图的过程中,用户可能有对一个已经存在的图形存在复制多份的需求,也就是说,已经存在的图形是稳定的,将要复制出的复制图形是变化的.
#include <iostream>
#include <string>
using namespace std;
class Graph {
public:
Graph(string shape="矩形",string color="黑色") {
this->shape = shape;
this->color = color;
}
Graph(const Graph& graph) {//拷贝构造函数
shape = graph.shape;
color = graph.color;
}
Graph* clone() { return new Graph(*this); }//返回自己本身作为复制的材料
void discription() { cout << "图形为:" << color << shape << endl; }
private:
string shape;//形状
string color;//颜色
};
class User{
public:
User(Graph* prototype) { this->prototype = prototype; }
void draw() {
Graph* newGraph = prototype->clone();//复制对象状态
newGraph->discription();
}
private:
Graph* prototype;
};
int main(void) {
Graph* graph1 = new Graph;
Graph* graph2 = new Graph("圆形", "红色");
User user1(new Graph);
User user2(graph2);
user1.draw();
user2.draw();
system("pause");
return 0;
}
依然是组合的方式,不过该成员不能直接使用,而是通过调用该成员对象的方法返回对象本身,来用于创建新的对象并且属性得到保留.如果需要改变属性,只需调用新对象修改内部属性的方法即可.