设计模式学习系列6 原型模式(prototype)
原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可。
1原型模式构成

客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,C++实现的抽象类,此角色给出所有的具体原型类所需的接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。
2原型模式C++实现
(1)通过C++的拷贝构造函数实现
(2)clone()函数返回的类是基类,建议通过static_const<>()进行转换为子类
(3)原型模式实现过程中会涉及浅拷贝和深拷贝的问题,clone()编写的时候要注意
(4)原型模式创建新的对象简单了很多,只需要根据原型就可以获得,不过使用原型的时候内存在clone内部开辟,要记得释放
1:
2: /*设计模式学习系列之原型模式
3: * 参考书籍《大话设计模式》
4: * 通过明确的clone()来创造新对象,不需要知道创建的任何细节
5: */
6: #include<iostream>
7: using namespace std ;
8: //接口类
9: class Prototype
10: {
11: public:
12: virtual Prototype* Clone() const = 0 ;
13: };
14:
15: struct stStruct
16: {
17: int num ;
18: string str ;
19:
20: stStruct()
21: {
22: num= 0 ;
23: str = "" ;
24: }
25: };
26: class PrototypeA:public Prototype
27: {
28: protected:
29: int a ;
30: string str;
31: public:
32: PrototypeA():a(0)
33: {
34: }
35: ~PrototypeA()
36: {
37: }
38: //参数构造函数1
39: PrototypeA(const int& _a , const string& _str ):a(_a),str(_str)
40: {
41:
42: }
43: //参数构造函数
44: PrototypeA(const PrototypeA& _proto)
45: {
46: a = _proto.a ;
47: str = _proto.str;
48: }
49:
50: //clone()函数 深拷贝
51: Prototype* Clone() const
52: {
53: PrototypeA *P = new PrototypeA(*this);
54: return P ;
55: }
56:
57: void show()
58: {
59: cout << a << "---" << str << endl;
60: }
61:
62: void SetA(const int& _a)
63: {
64: a = _a ;
65: }
66:
67: void SetStr(const string& _str)
68: {
69: str = _str ;
70: }
71: };
72:
73: int main()
74: {
75: PrototypeA *test = new PrototypeA(1,"xxxx");
76:
77: //通过clone()创建
78: PrototypeA *test_clone = static_cast<PrototypeA *>(test->Clone());
79:
80: //通过拷贝构造函数创建
81: PrototypeA *test2 = new PrototypeA(*test);
82:
83: cout << "===============赋值结束" << endl ;
84: test->show();
85: test_clone->show();
86: test2->show();
87:
88: cout << "===============修改值类型" << endl ;
89: test->SetA(3);
90: test->show();
91: test_clone->show();
92: test2->show();
93:
94: cout << "===============修改字符类型" << endl ;
95: test->SetStr("343245");
96: test->show();
97: test_clone->show();
98: test2->show();
99: }
3涉及到的C++知识点
(1)c++深拷贝和浅拷贝http://www.2cto.com/kf/201205/133802.html
(2)C++类 拷贝赋值构造函数http://blog.chinaunix.net/uid-25808509-id-354211.html
设计模式学习系列6 原型模式(prototype)的更多相关文章
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 跟着实例学习设计模式(7)-原型模式prototype(创建型)
原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的样例的类图来说明原型模式. 类图: 原型模式主要用于对象的复制.它的核心是就是类图 ...
- 设计模式(五)原型模式 Prototype
原型模式: 原型模式,是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”. 在 Java 中,原型模式体现为 Object 的 clone() 方法. 所有类都可 ...
- 设计模式学习系列9 外观模式Facade
1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- Java设计模式(4)原型模式(Prototype模式)
Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
随机推荐
- Solr常用查询语法笔记
1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...
- asp.net获取客户端IP方法(转载)
最近web获取客户端ip,看到下面这篇文章,转载过来,一起分享(转载地址:http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html) 通 ...
- Windows 10 上强制Visual Studio以管理员身份运行
Windows 10 的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8 ...
- vim 多窗口
打开多个文件: 1.vim还没有启动的时候: 在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :open file 可以再打开一 ...
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236 Spring获取ApplicationContex ...
- kindeditor用法
<?php require_once '../include.php'; checkLogined(); $rows=getAllCate(); //echo $rows; if(!$rows) ...
- SCU3312 Stockholm Knights(最大流)
题目大概说一个n×m的格子中,'.'代表空地,'#'代表障碍,'K'代表骑士,'D'代表目的地.骑士每走一步花一条,每一步可以往(+2,+3)(-2,+3)...八个方向走,问占领所有目的地最少要几天 ...
- HDU4081 Qin Shi Huang's National Road System(次小生成树)
枚举作为magic road的边,然后求出A/B. A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树. 这么求得: 先在原图求MST,边总和记为s,顺便求出M ...
- 理解cookie的path和domain属性
今天在做验证码时发现一个问题:A.B窗口都打开同一个页面,A先生成一个验证码,B再生成验证码,这时A所生成的验证码被B覆盖掉了.原因是使用了同名的cookie来存储验证码.一时找不到解决方法就参考了W ...
- HTMl5/CSS3/Javascript 学习推荐资源
HTMl5/CSS3/Javascript 学习推荐资源 前端的定义应该是数据内容的展示,在国内大家都觉得前端只是HTML+CSS+Javascript,但是实际上与展示有关的都是前端,所以Ruby/ ...