设计模式(7)–原型模式

Posted by Tango on October 23, 2015

原型模式属于创建型模式,《设计模式》一书对中原型模式的描述为:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式的关键点在于原型实例与实例的复制,而实例的克隆分为深复制与浅复制。深复制与浅复制的不同点在于,浅复制对于字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象与其副本引用同一对象。浅复制的结果是副本所有变量都包含与原来对象相同的值,而所有的对其他对象的引用都仍指向原来的对象。深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

在使用深复制时,我们需要把握好复制的深度,并且要当心出现循环引用的问题。

1.模式适用性

  • 当实例化的类实在运行时刻指定时
  • 当使用一个原型可以简化一批对象的创建过程时

2.模式结构

3.实现

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

class Human
{
public:
	int sex;
	int age;
	virtual Human* clone() = 0;
	Human(){};
	virtual ~Human(){};
};

class Female : public Human
{
public:
	Female(){sex = 0;};
	~Female(){};
	Female* clone()
	{
		Female *ptr = new Female();
		memcpy(ptr, this, sizeof(Female));
		return ptr;
	};
};

class Male : public Human
{
public:
	Male(){sex = 1;};
	~Male(){};
	Male* clone()
	{
		Male *ptr = new Male();
		memcpy(ptr, this, sizeof(Male));
		return ptr;
	};
};

int main()
{
	Female *mm = new Female();
	cout << "mm's sex number is:"<< mm->sex << endl;
	Female *mm1 = mm->clone();
	cout << "mm1's sex number is:"<< mm1->sex << endl;

	Male *gg = new Male();
	gg->age = 18;
	cout << "gg's sex number is:"<< gg->sex << "\tage is:" << gg->age << endl;
	Male *gg1 = gg->clone();
	cout << "gg1's sex number is:"<< gg1->sex << "\tage is:" << gg1->age << endl;
	
}