这是大话设计模式中的原型模式的c++版本
/*
* prototype.cpp
*
* Created on: Jul 21, 2017
* Author: clh01s@163.com
* 原型模式
*/
#include <iostream>
#include <string>
using namespace std;
class Resume
{
public:
Resume(string name)
{
_name = name;
}
void SetPerSonalInfo(string sex,string age)
{
_sex = sex;
_age = age;
}
void SetWorkExperience(string timeArea,string company)
{
_timeArea = timeArea;
_company = company;
}
void Display()
{
cout<<"姓名:"<<_name<<"性别:"<<_sex<<"年龄:"<<_age<<endl
<<"工作经历:"<<_timeArea<<"公司:"<<_company<<endl;
}
//克隆函数
Resume *clone()
{
return new Resume(*this);
}
private:
string _name;
string _sex;
string _age;
string _timeArea;
string _company;
};
int main()
{
Resume *man = new Resume("大锤");
man->SetPerSonalInfo("男", "32");
man->SetWorkExperience("2003-2013", "xx集团");
//调用克隆函数之后修改自己需要修改的数据,其他不变
Resume *man2 = man->clone();
man2->SetWorkExperience("2013-2014", "a公司");
Resume *man3 = man->clone();
man3->SetPerSonalInfo("大锤", "33");
man->Display();
man2->Display();
man3->Display();
return 0;
}
代码输出:
姓名:大锤性别:男年龄:32
工作经历:2003-2013公司:xx集团
姓名:大锤性别:男年龄:32
工作经历:2013-2014公司:a公司
姓名:大锤性别:大锤年龄:33
工作经历:2003-2013公司:xx集团
+++++++++++++++++++
原型模式优点(摘抄于《设计模式》):
1.它对客户隐藏了具体的产品类,减少了客户知道的名字数量.另外这些模式使客户无需改变即可使用与特定用户相关的类.
2.运行时刻增加和删除产品 prototype允许客户只注册原型实例就可以讲一个新的产品类并入系统.可以在运行时刻增加和删除产品的特性使得它比其他创建模式更加的灵活.
3.改变值以指定新对象 高度动态的系统允许你通过对象复合定义新的行为.例如可以改变一个对象的值而且不定义新的类.你通过实例化已有的类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象.客户可以将职责代理给原型,从而表现出新的行为.
4.改变结构以指定新对象 我们可以改变其他对象的值而保留其中需要的对象,这样就可以方便的复用一些特殊的对象.
5.减少子类的构造 prototype模式使得你克隆一个原型而不是请求一个工厂方法去产生一个新的对象.因此你根本不需要Creator类层次.
6.用类动态配置应用 一些运行时刻环境允许你动态将类装载到应用中.
缺点:
prototype的主要缺陷是每一个prototype的子类都必须实现clone操作,这可能很困难.例如,当所考虑的类已经存在时就难以新增clone操作.当内部包括一些不支持拷贝或者有循环引用的对象时,实现克隆可能也会很困难的.
转载请注明源地址:http://blog.csdn.net/clh01s