设计模式学习系列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
转载于:https://www.cnblogs.com/zsb517/p/3412328.html
设计模式学习系列6 原型模式(prototype)相关推荐
- 【设计模式学习笔记】原型模式
原型模式,估计这是最简单的模式了.这个模式可以用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.额外说一句,这里的创建对象只是浅拷贝的. 文章目录 ...
- 跟着实例学习设计模式(7)-原型模式prototype(创建型)
原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的样例的类图来说明原型模式. 类图: 原型模式主要用于对象的复制.它的核心是就是类图 ...
- 设计模式(三)原型模式 Prototype
原型模式 原型模式概念 适用场景 简单克隆 浅克隆 深克隆 破坏单例 开源工具 总结 原型模式概念 原型模式(Prototype Pattern)是指原型实例指定创建对象的 种类,并且通过拷贝这些原型 ...
- 设计模式学习系列9 外观模式Facade
1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式(23):创建型-原型模式(Prototype)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- Java设计模式--原型模式Prototype
原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...
- 原型模式(ProtoType) - Java里的对象复制
一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...
最新文章
- RocketMQ 4.5.1 双主双从异步复制环境搭建
- pytorch loss inf
- RocketMQ主机磁盘空间有限,如何无限期延长消息存储?
- webpack 使用教程--实时刷新测试
- python函数定义错误_[转载]python之函数的使用及异常处理2021.1.30
- 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层
- 万能无线键盘对码软件_Ceke M87蓝牙机械键盘拆解评测 - Mac小伴侣
- Ansys ——自定义不规则形状梁截面
- 初学者:如何使用虚拟PC将Windows 7安装到虚拟机
- 基础算法 —— 递归/递推 —— 汉诺塔问题(Hanoi)
- Spring4.x(17)--SpringIOC注解的HelloWorld
- 2021级C语言大作业 - 消灭星星
- 解决coding上的hexo博客访问不了的问题
- CSS:实现闪烁效果动画
- 映美530k驱动不能安装问题
- docker容器无法使用top命令
- arm9开发板重新生成文件系统,并烧写
- 利用Matlab筛选给定条件的数据
- echarts的基本用法——未完待续
- 计算机导师招生,计算机学院2017年具备招生资格的硕士研究生导师一览表.DOC