C++ 09原型模式

原创 2015年11月19日 16:19:11

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

                                                                         原型模式的结构图


Prototype原型类,声明一个克隆自身的接口

ConcretePrototype具体原型类,实现一个克隆自身的操作

Client 让一个原型类对象克隆自身(执行的是深拷贝),从而创建出一个新的对象,使克隆对象不与原有的对象相关联,也就是说,原对象和克隆对象是两个完全不同的对象。

 

关于简历原型的具体实现

在C++中没有专门的接口,我们只有定义抽象类相当于接口的功能。

 

由于在Resume中没有ConcretePrototype,所以这里就不定义具体类了,也可以说把Prototype和ConcretePrototype类合并成一个Resume类。

#include<iostream>
#include<string>

using namespace std;
//简历--既是原型类也是具体类
class Resume
{
private:
	string name;
	string sex;
	string age;
	string timeArea;
	string company;
public:
	Resume(string n) :name(n)
	{}
	//设置个人信息
	void setPersionalInfo(string _sex, string _age)
	{
		sex = _sex;
		age = _age;
	}

	//设置工作经历
	void setWorkExperience(string _timeArea, string _company)
	{
		timeArea = _timeArea;
		company = _company;
	}

	//显示
	void display()
	{
		cout << name << " 的基本信息如下:" << endl;
		cout << "性别:" << sex << endl;
		cout << "年龄:" << age << endl;
		cout << "工作经历:" << timeArea << " " << company << endl;
	}
	Resume* clone()
	{
		Resume *b=0;
		b = new Resume(this->name);
		b->setPersionalInfo(sex,age);
		b->setWorkExperience(timeArea,company);
		return b;
	}

};

//客户端调用代码
int main()
{
	Resume* a = new Resume("张三");
	a->setPersionalInfo("男", "29");
	a->setWorkExperience("2008-2010", "XX公司");

	Resume* b = a->clone();
	b->setWorkExperience("2012-2014", "YY公司");

	a->display();
	b->display();

	return 0;
}</span></span>

运行的结果信息如下:

以上运行结果没有任何问题,是我们想要的结果。

如果客户端这样写

<span style="font-size:14px;"><span style="font-size:12px;">int main()
{
	Resume* a = new Resume("张三");
	a->setPersionalInfo("男", "29");
	a->setWorkExperience("2008-2010", "XX公司");

	Resume* b = a;
	b->setWorkExperience("2012-2014", "YY公司");

	a->display();
	b->display();

	return 0;
}

运行结果如下:



解释:只对指针进行简单拷贝(浅拷贝),而不对指针所指向的对象进行拷贝,则两个指针就是指向同一个内存空间,共享同一个内存对象。改变任何一个对象,另一个对象也会跟着发生变化。

我们的目的其实就是拷贝指针对象所指向的对象(深拷贝),而不是简单的拷贝指向对象的指针。所以可以利用clone方法实现这一功能。

 

原型模式中的clone函数就像C++中的copy构造函数或copy赋值运算符的功能。但定义一个clone函数会更灵活的拷贝指针或引用。copy构造函数或copy赋值运算符往往是在一个对象初始化另一个对象或者把一个对象赋值给另一个对象(不是对象指针隐式的被调用。



我所理解的设计模式(C++实现)——原型模式(Prototype Pattern)

解决的问题: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这个其实和C++的拷贝构造函数的作用是一致的,实际上就是动态抽取当前对象运行时的状态。 类图结构:      ...
  • LCL_data
  • LCL_data
  • 2013年04月06日 16:01
  • 9240

C++设计模式-Prototype原型模式

作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言...
  • u010229420
  • u010229420
  • 2016年08月22日 16:00
  • 667

浅拷贝与深度拷贝(原型模式)

深度复制
  • liang08114
  • liang08114
  • 2016年05月09日 11:14
  • 509

原型模式的java实现例子

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。...
  • pnjlc
  • pnjlc
  • 2016年09月30日 17:51
  • 1427

设计模式之 原型模式(prototype)(C++实现 深拷贝 + 浅拷贝版本[bug])

本文介绍设计模式中的原型模式。 本质上其实就是克隆。 下面以个人简历很工作经历为例。 深拷贝版本: #include #include #include using namespa...
  • u013575812
  • u013575812
  • 2016年03月31日 23:34
  • 482

原型模式(设计模式_09)

今天给大家介绍一种模式,原型模式例如:要创建很多个对象,常规思维是 new 对象(),new 对象(),new 对象(),new 对象(),new 对象(),new 对象(),new 对象(),new...
  • u011967006
  • u011967006
  • 2016年12月16日 10:19
  • 218

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写。后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年10月22日 16:20
  • 4430

原型模式的使用分析

原型模式是一种简单、易使用的创建型设计模式,通过给出一个原型对象来指明所创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以...
  • u010024991
  • u010024991
  • 2016年12月02日 11:18
  • 1168

JAVA设计模式之原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype...
  • jason0539
  • jason0539
  • 2014年04月08日 08:22
  • 14818

Java设计模式——原型模式

原型模式是为了解决一些不必要的对象创建过程。当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了。虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些需要说...
  • u013761665
  • u013761665
  • 2016年03月03日 13:50
  • 1847
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 09原型模式
举报原因:
原因补充:

(最多只允许输入30个字)