大话设计模式c++实现--原型模式

来源:互联网 发布:凯程网络课程 编辑:程序博客网 时间:2024/06/08 06:57

1、概念

原型模式(Prototype):用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2、说明

(1)原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

(2)一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,有对性能是大大的提高。因为如果不用Clone,每次new,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。

(3)浅复制和深复制:

浅复制: 被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。

深复制: 把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

Clone的时候使用深复制。


// designpattern9_prototype.cpp : 定义控制台应用程序的入口点。
//
//原型模式
#include "stdafx.h"
#include <iostream>
#include <string>
//工作经验类:WorkExperience类
class WorkExperience
{
private:
std::string workDate;
std::string company;
public:
WorkExperience(){}
~WorkExperience(){}
//供克隆调用的构造函数
WorkExperience(WorkExperience* work)
{
this->workDate = work->workDate;
this->company = work->company;
}
std::string getWorkDate()
{
return workDate;
}
void setWorkDate(std::string workDate)
{
this->workDate = workDate;
}
std::string getCompany()
{
return company;
}
void setCompany(std::string company)
{
this->company = company;
}


//克隆
WorkExperience*  Clone()
{
//调用供克隆调用的构造函数WorkExperience(WorkExperience)
return new WorkExperience(this);
}
};


//原型类,声明一个克隆自身的接口。
class Prototype
{
protected:
std::string name;
std::string sex;
std::string age;
std::string timeArea;
std::string company;
public:
virtual void SetPersonalInfo(std::string sex, std::string age) = 0;
virtual void Display() = 0;
virtual Prototype* Clone() = 0;


};


//具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作。
class Resume :public Prototype
{
private:
WorkExperience* work;
public:
Resume(std::string name)
{
this->name = name;
work = new WorkExperience();
}
~Resume()
{
delete work;
}
//供克隆调用的构造函数
Resume(WorkExperience* work)
{
this->work = work->Clone();
}
void SetPersonalInfo(std::string sex, std::string age)
{
this->sex = sex;
this->age = age;
}
void SetWorkExperience(std::string workDate, std::string company)
{
work->setWorkDate(workDate);
work->setCompany(company);
}
void Display()
{
std::cout << name << "  " << sex << "  " << age << std::endl;
std::cout << "工作经历  " << work->getWorkDate() << "  " << work->getCompany() << std::endl;
}


//克隆
Resume* Clone()
{
//调用 供克隆函数调用的构造函数Resume(work)
Resume *cloneResume = new Resume(work);
cloneResume->name = this->name;
cloneResume->age = this->age;
cloneResume->sex = this->sex;
return cloneResume;
}
};


void main()
{
Resume* a = new Resume("大鸟");
a->SetPersonalInfo("男", "29");
a->SetWorkExperience("1998-2000", "XX公司");


Resume* b = a->Clone();
b->SetWorkExperience("1998-2006", "YY公司");


Resume* c = b->Clone();
c->SetPersonalInfo("男", "24");
c->SetWorkExperience("1998-2003", "ZZ公司");

a->Display();
b->Display();
c->Display();

delete a;
delete b;
delete c;
a = b = c = NULL;
system("pause");
}

1 0
原创粉丝点击