1.相关链接
设计模式目录
2.类图
3.白话说明
原型模式:就是用拷贝的方式创建一个新的对象。
模式价值:这个不太好说,我也没找到一个合适的例子来解释他的价值,如果真的有合适的需求这样做,那么你就知道他的价值了。
现在你只需要知道拷贝一个新对象和创建一个新对象的差别就行了。(现在是学这个模式的第一阶段,知道这个模式的特点就行了)
补充:后来看了《设计模式》那本书,明白了该模式的意图。就是减少类的数量,通过改变某个成员变量的值,来承载一个维度的变化。
说白了,就是没有定义新类的情况下,用成员变量的某个值做变化来承载变化,也是使结构清晰的一种手段。比如某个类性在某些情况下后有很多中变化,而这些变化仅仅是一个成员变量的值不同而已。而这个值的变化范围有非常大,这时候我们没有必要用继承来承载这些变化。用组合及可以了,克隆一个对象,然后为该对象设置不同成员变量。由该变量承载变化。
其实这种设计等同于一个桥接的效果,给该对象去桥接不同的对象。而不是通过继承来增加类。
说到这好像是,拷贝+桥接=原型模式。这个桥接通常会更小,桥接的对象有可能是一个简单类型(int等)。而桥接模式的桥接对象一般是复杂类型。
4.代码
#include <iostream>
using namespace std;
#include <string>
// 抽象层
class Prototype{
public:
int data;
virtual Prototype* Clone()=0;
};
class Client{
public:
Prototype* prototype;
void Operation(){
//模式要点:客户端通过克隆的方式来获取对象
Prototype* p_a = prototype->Clone();
cout<<"p_a:data"<<p_a->data<<"\n";
Prototype* p_b = prototype->Clone();
cout<<"p_a:data"<<p_b->data<<"\n";
}
};
//具体层
class ConcretePrototype1: public Prototype{
public:
ConcretePrototype1(){
data = 5;
}
virtual Prototype* Clone(){
ConcretePrototype1* o = new ConcretePrototype1();
o->data = data;
return o;
}
};
class ConcretePrototype2: public Prototype{
public:
ConcretePrototype2(){
data = 6;
}
virtual Prototype* Clone(){
ConcretePrototype2* o = new ConcretePrototype2();
return o;
}
};
//客户端调用
int main()
{
cout<<"原型模式演示\n";
Client client;
ConcretePrototype1* p1 = new ConcretePrototype1();
client.prototype = p1;
client.Operation();
ConcretePrototype2* p2 = new ConcretePrototype2();
client.prototype = p2;
client.Operation();
//看代码不用考虑以下内容
int cin_a;
cin>>cin_a;
return 0;
}