首页 > 其他 > 详细

原型模式

时间:2015-01-17 12:26:40      阅读:275      评论:0      收藏:0      [点我收藏+]

一、简介

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

2、为什么会用到原型模式?

(1)既然可以直接new,为什么会用到原型模式?

这个可以从两个角度来说,第一,时间消耗角度:如果创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,这时如果需要一个跟刚刚实例化对象参数差不多的实例(可以完全相同,也可以大部分相同)那么直接使用 new 创建这样一个实例就显得太昂贵了,而如果使用原型模式克隆一个一模一样的实例(或者先克隆一个一模一样的实例,然后做小部分的改动)就显得非常的合理。第二,用户的修改麻烦程度角度,举个例子,假设要通过一个类实例化一各班同学的毕业信息,那么会有大量雷同的信息,这时如果要用new实例化,就需new很多次,更悲剧的是如果所有同学的信息都录入完毕,突然发现某个参数的信息录入错了,这时要对每一个实例分别进行修改,而如果使用原型模式克隆就不会出现这个问题。

(2)既然类可以直接赋值,为什么会用到原型模式?

因为类之间直接赋值的话,默认的拷贝函数是进行引用赋值的,用的是浅拷贝

浅拷贝:通过一个原型实例(这里暂称为老对象)克隆所得到的对象(这里暂时称为新对象),而这个新对象中所有的值类型变量都含有与老对象相同的值,但是,新对象所有的对其他对象的引用却是和老对象指向同一个地方,即对引用类型来说,老对象和新对象指向同一个引用对象。

使用浅拷贝可能会出现一些问题:如修改新对象的参数时,原来对象的参数也会被改变,另外对于指针的浅则会造成更加糟糕的结果,这点可以参见C++ primer plus "类和动态内存分配"章节

深拷贝:新对象所有的对其他对象的引用都是指向了复制过的对象,而不再是和老对象指向同一个对象。

二、C++程序

 1 // 原型模式.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 using namespace std;
 7 
 8 //声明一个虚拟基类,所有的原型都从这个基类继承,   
 9 class prototype  
10 {  
11 public:  
12     prototype(){}  
13     virtual ~prototype(){}  
14     virtual prototype* clone() = 0;//纯虚函数,需要供继承者自行实现   
15     //为了测试而添加的函数
16     virtual void show()=0;
17 }; 
18 
19 // 派生自Prototype,实现Clone方法 
20 class concreateprototype  :public prototype
21 {  
22 public:  
23     concreateprototype  (){}  
24     concreateprototype  (const prototype&){}
25     virtual ~concreateprototype (){}  
26     virtual prototype* clone()
27     {
28         return new concreateprototype(*this);
29     }
30     //为了测试添加一个show函数
31     void show()
32     {
33         cout<<"hello,i am a concreateprototype"<<endl;
34     }
35 };  
36 
37 //用户接口
38 int _tmain(int argc, _TCHAR* argv[])
39 {
40     prototype  *people1=new concreateprototype();
41     prototype  *people2=people1->clone();
42     people2->show();
43     return 0;
44 }

 

原型模式

原文:http://www.cnblogs.com/bewolf/p/4230230.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!