[设计形式]Prototype原型模式

[设计模式]Prototype原型模式

prototype原型模式

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

[设计形式]Prototype原型模式

 

小demo

prototype.h

#ifndef PROTOTYPE_H
#define PROTOTYPE_H

// 虚拟基类,所有原型的基类,提供Clone接口函数
class Prototype
{
public:
	Prototype(){}
	virtual ~Prototype(){}

	virtual Prototype* Clone() = 0;
};

// 派生自Prototype,实现Clone方法
class ConcreatePrototype1 : public Prototype
{
public:
	ConcreatePrototype1();
	ConcreatePrototype1(const ConcreatePrototype1& cp);
	virtual ~ConcreatePrototype1();

	virtual Prototype* Clone();
};

// 派生自Prototype,实现Clone方法
class ConcreatePrototype2 : public Prototype
{
public:
	ConcreatePrototype2();
	ConcreatePrototype2(const ConcreatePrototype2& cp);
	virtual ~ConcreatePrototype2();

	virtual Prototype* Clone();
};

#endif

 

prototype.cpp

#include "Prototype.h"
#include <iostream>

ConcreatePrototype1::ConcreatePrototype1()
{
	std::cout << "construction of ConcreatePrototype1\n";
}

ConcreatePrototype1::~ConcreatePrototype1()
{
	std::cout << "destruction of ConcreatePrototype1\n";
}

ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1& cp)
{
	std::cout << "copy construction of ConcreatePrototype1\n";
}

Prototype* ConcreatePrototype1::Clone()
{
	return new ConcreatePrototype1(*this);
}

ConcreatePrototype2::ConcreatePrototype2()
{
	std::cout << "construction of ConcreatePrototype2\n";
}

ConcreatePrototype2::~ConcreatePrototype2()
{
	std::cout << "destruction of ConcreatePrototype2\n";
}

ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2& cp)
{
	std::cout << "copy construction of ConcreatePrototype2\n";
}

Prototype* ConcreatePrototype2::Clone()
{
	return new ConcreatePrototype2(*this);
}

 

main.cpp

#include "Prototype.h"
#include <stdlib.h>

int main()
{
	Prototype* pPrototype1 = new ConcreatePrototype1();
	Prototype* pPrototype2 = pPrototype1->Clone();

	Prototype* pPrototype3 = new ConcreatePrototype2();
	Prototype* pPrototype4 = pPrototype3->Clone();

	delete pPrototype1;
	delete pPrototype2;
	delete pPrototype3;
	delete pPrototype4;
	system("pause");
	return 0;
}

 

Prototype模式的结构和实现都很简单,其关键就是C++中拷贝构造函数的实现方式,这也是C++实现技术层面上的事情。在C++中拷贝构造函数曾经是很多程序员的噩梦,浅层拷贝(在位拷贝)和深层拷贝(主要指有指针,复合对象的情况)的魔魇也是很多程序员在面试时候的快餐盒系统崩溃时候的根源之一。 

Prototype模式通过复制原型(prototype)而获得新对象创建的功能,这里prototype本身就是“对象工厂”(因为能够生产对象),实际上prototype模式和Builder模式,AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象)AbstractFactory模式重在生产多个相互依赖类的对象,而prototype模式重在从自身负责自己创建新类。