软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
优点:从一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。并能提高创建的性能。说白了就COPY技术,把一个对象完整的COPY出一份。
原型模式实现的关键就是实现Clone函数,对于克隆函数的编写,涉及到浅拷贝和深拷贝问题,所谓浅拷贝就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然会指向原来的对象,而深拷贝就是把引用对象的变量指向复制过的新对象而不是原有的被引用的对象。
例子如下:在这里基类我们省略没写,直接对具体原型类进行编写;
#include <string>
#include <iostream>
using namespace std;
class workExperience{
private:
string company;
string areaWorkTime;
public:
void setCompany(string COM)
{
this->company = COM;
}
void setWorkTime(string WorkTime)
{
this->areaWorkTime = WorkTime;
}
string getCompany()
{
return this->company;
}
string getWorkTime()
{
return this->areaWorkTime;
}
};
class Resume{
private:
string name;
string sex;
int age;
workExperience *work;
public:
Resume(){}
Resume(string NAME)
{
this->name = NAME;
work = new workExperience();
}
//设置个人信息
void SetPersonInfo( string SEX, int AGE)
{
this->age = AGE;
this->sex = SEX;
}
//设置工作经历
void SetWorkExperience(string COMPANY, string AREAWORKTIME)
{
work->setCompany(COMPANY);
work->setWorkTime(AREAWORKTIME);
}
//显示
void Display()
{
cout << "姓名:" << name << " " << "年龄:"
<< age << " " << "性别:" << sex << endl;
cout << "工作经历:" <<work->getCompany() << " "
<< "工作时间:" << work->getWorkTime() << endl;
}
/*
需要考虑深拷贝问题原型模式要解决的问题就是不用重新初始化对象,
而是动态地获取对象运行时的状态,你只需要对对象做部分属性或行为的修改即可
*/
virtual Resume* Clone() //深拷贝
{
Resume *p = new Resume();
p->age = this->age; //复制对象
p->name = this->name;
p->sex = this->sex;
p->work = new workExperience();
return p;
}
//virtual Resume* Clone()//浅拷贝
//{
// Resume *p = new Resume();
// *p = *this;
// return p;
//}
};
int main()
{
Resume *a = new Resume("小高");
a->SetPersonInfo("男", 25);
a->SetWorkExperience("中科院", "2017-8—2018-7");
Resume *a1 = a->Clone();
a1->SetWorkExperience("研究院", "2015-7—2015-9");
a->Display();
a1->Display();
return 0;
}
上述给定的代码中有浅拷贝和深拷贝,分别尝试运行,其中区别可见运行结果
小结:原型模式就是从一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。并能提高创建的性能。说白了就COPY技术,把一个对象完整的COPY出一份。这里注意Copy所指为深拷贝;