创建型:原型模式(Prototype)

我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。
原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高。
1. 当一个系统应该独立于它的产品创建、构成和表示时,要使用 Prototype模式
2. 当要实例化的类是在运行时刻指定时,例如,通过动态装载;
3. 为了避免创建一个与产品类层次平行的工厂类层次时
4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。(也就是当我们在处理一些对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,可能我们使用原型模式更合适)。
原型模式结构如下页上图所示:
 
Prototype.h
#ifndef _PROTOTYPE_H
#define _PROTOTYPE_H

class 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 copy
	std::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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值