Chapter6:原型模式

原型模式(Prototype),用原型实例指针创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
不用重新初始化对象,而是动态地获得对象运行时的状态。
在很多关于原型模式的JAVA、C#的资料中都会顺带提到浅复制与深复制。这里也顺带复习下
“浅复制”被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
“深复制”把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

 

实际应用
工程结构:
(1)原型抽象类 Prototype.h
(2)具体原型类 ConcretePrototypeA.h、ConcretePrototypeB.h
(3)客户端       PrototypeApplication.cpp

 

(1)原型抽象类 Prototype.h

 

#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_

#include
<string>
#include
<iostream>
using namespace std;

class CPrototype
{
public:
CPrototype(){}
virtual ~CPrototype(){}

virtual CPrototype* Clone() = 0;

private:
string m_strId;
};

#endif //_PROTOTYPE_H_

 


(2)具体原型类 ConcretePrototypeA.h、ConcretePrototypeB.h

 

 

#ifndef _CONCRETE_PROTOTYPE_A_
#define _CONCRETE_PROTOTYPE_A_

#include
"Prototype.h"

class CConcretePrototypeA : public CPrototype
{
public:
CConcretePrototypeA()
{
cout
<< "construction of CConcretePrototypeA\n";
}

CConcretePrototypeA(
const CConcretePrototypeA& ObjectA)
{
cout
<< "copy construction of CConcretePrototypeA\n";
}

virtual ~CConcretePrototypeA()
{
cout
<< "destruction of CConcretePrototypeA\n";
}

virtual CPrototype* Clone()
{
return (new CConcretePrototypeA(*this));
}
};

#endif //_CONCRETE_PROTOTYPE_A_

 

#ifndef _CONCRETE_PROTOTYPE_B_
#define _CONCRETE_PROTOTYPE_B_

#include
"Prototype.h"

class CConcretePrototypeB : public CPrototype
{
public:
CConcretePrototypeB()
{
cout
<< "construction of CConcretePrototypeB\n";
}

CConcretePrototypeB(
const CConcretePrototypeB& ObjectB)
{
cout
<< "copy construction of CConcretePrototypeB\n";
}

virtual ~CConcretePrototypeB()
{
cout
<< "destruction of CConcretePrototypeB\n";
}

virtual CPrototype* Clone()
{
return (new CConcretePrototypeB(*this));
}
};

#endif //_CONCRETE_PROTOTYPE_B_

 


(3)客户端       PrototypeApplication.cpp

 

 

// PrototypeApplication.cpp : 定义控制台应用程序的入口点。
//

#include
"stdafx.h"
#include
"ConcretePrototypeA.h"
#include
"ConcretePrototypeB.h"

int _tmain(int argc, _TCHAR* argv[])
{
CPrototype
* pObjectA = new CConcretePrototypeA();
CPrototype
* pObjectB = pObjectA->Clone();

CPrototype
* pObjectC = new CConcretePrototypeB();
CPrototype
* pObjectD = pObjectC->Clone();

delete pObjectA;
delete pObjectB;
delete pObjectC;
delete pObjectD;

system(
"pause");

return 0;
}

 

 

posted @ 2010-08-17 00:15  奋斗の机器  阅读(184)  评论(0编辑  收藏  举报