设计模式学习系列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 ...
随机推荐
- JAVA开发第一步——JDK 安装
JDK,Java Development Kit. And JRE ,Java Runtime Environment. jdk分64位和32位,可自行去Oracle官网下载 直接百度下载链接 Win ...
- Vim插件安装
一.常用的插件 sudo apt-get install vim vim-scripts vim-docsudo apt-get install ctagssudo apt-get install v ...
- GRE学习日志
发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...
- Oracle 11g必须开启的服务及服务详细介绍(转)
成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通过禁止非必须开启的Oracle服务可以提升电脑的运行速度.那么,具体该怎么做呢? 按照win ...
- Android利用调试器调试程序
首先,通过在AndroidManifest.xml文件中添加android:debuggable=”true”选项, <application android:icon=”@drawable/i ...
- Android SDK、ADT认识
Android SDK: (software development kit)软件开发工具包. 包含一些实用的Android sdk api,供开发者使用,就像开发java程序需要的使用JDK一样. ...
- Hadoop的mapreduce开发过程,我遇到的错误集锦(持续更新)
1.Text包导错了. 将import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text; 改为import o ...
- JVM的基本结构
首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数 ...
- js:语言精髓笔记3----语句
JS语句分类:(注意语句都是有返回值的) 声明语句: 变量声明语句: 标签声明语句: 函数声明语句: 表达式语句:(表达式加分号) 变量赋值语句:具有声明一个变量的隐式效果: 函数调用语句; 属性赋值 ...
- JAVA定时执行任务的三种方法
1.利用 java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务 Timer timer=new Timer(); timer.schedule(new ListBy ...