创建型:原型模式(Prototype)

来源:互联网 发布:淘宝客站内推广 编辑:程序博客网 时间:2024/05/17 23:02
我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。
原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高。
1. 当一个系统应该独立于它的产品创建、构成和表示时,要使用 Prototype模式
2. 当要实例化的类是在运行时刻指定时,例如,通过动态装载;
3. 为了避免创建一个与产品类层次平行的工厂类层次时
4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。(也就是当我们在处理一些对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,可能我们使用原型模式更合适)。
原型模式结构如下页上图所示:
 
Prototype.h#ifndef _PROTOTYPE_H#define _PROTOTYPE_Hclass CPrototype{public:virtual CPrototype* Clone() const = 0;virtual ~CPrototype();protected:CPrototype();};class CPrototypeDrived1 : public CPrototype{public:virtual CPrototype* Clone() const;virtual ~CPrototypeDrived1();CPrototypeDrived1();CPrototypeDrived1(const CPrototypeDrived1& rhs);protected://CPrototypeDrived1* operator=(const CPrototypeDrived1& rhs);};#endif
Prototype.cpp#include "Prototype.h"#include <iostream>CPrototype::CPrototype(){std::cout << "CPrototype()" << std::endl;}CPrototype::~CPrototype(){std::cout << "~CPrototype()" << std::endl;}CPrototypeDrived1::CPrototypeDrived1(){std::cout << "CPrototypeDrived1()" << std::endl;}CPrototypeDrived1::~CPrototypeDrived1(){std::cout << "~CPrototypeDrived1()" << std::endl;}CPrototype* CPrototypeDrived1::Clone() const {return new CPrototypeDrived1(*this);}CPrototypeDrived1::CPrototypeDrived1(const CPrototypeDrived1& rhs){//NOTE: very important to implement deep copystd::cout << "copy CPrototypeDrived1()" << std::endl;}
Main.cpp#include "stdafx.h"#include <iostream>#include "Prototype.h"int _tmain(int argc, _TCHAR* argv[]){CPrototype* p1 = new CPrototypeDrived1();CPrototype* p2 = p1->Clone();delete p1;p1 = 0;delete p2;p2 = 0;return 0;}