定义:原型模式(Prototype Pattern),用原型模式指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

类型:创建型模式。

类图

参与角色:

  1. CPrototype,抽象原型基类,提供一个Clone的接口以及一些设置显示的接口。
  1. CConcretePrototype,声明定义原型的相关参数,并实现Clone接口,主要是通过实现拷贝构造函数来完成的。

另外实现其他接口。

  1. Client,首先定义一个原型对象,然后以此为原型克隆新的对象。

概述:

如果只是为了更快的完成新对象的生成,其实就没必要使用原型模式了。因为可以直接使用拷贝构造函数即可。而使用原型模式最重要的原因是隔离Client去了解具体的实现类,降低模块间的耦合。Client只需要知道一个抽象类的指针,不仅可以操作具体各咱方法,另外也还可以生成新的对象。

另外,使用拷贝构造函数时,需要注意深拷贝及浅拷贝。浅拷贝,即按位进行拷贝,即两个对象的每一个成员变量是相同的。深拷贝,自定义拷贝,一般会处理指针,引用等类型,保证它们有相同的值,而不是它们本身相同。

有一批Thinkpad电脑,除了内存和硬盘容量外,其他配置都相同。我们可以通过原型对象生成新的对象,并且不需要知道具体的实现类名。

// 提供接口

 1 class CPrototype
 2
 3 {
 4
 5 public:
 6
 7     virtual CPrototype* Clone() = 0;
 8
 9     virtual void Show() = 0;
10
11     virtual void SetRam(int _nRam) = 0;
12
13     virtual void SetRom(int _nRom) = 0;
14
15 };

// 电脑的基本配置信息类

  1 class CComputerConfig : public CPrototype
  2
  3 {
  4
  5 public:
  6
  7     CComputerConfig(char* _szName, int _nRomSize, int _nRamSize) : m_nRomSize(_nRomSize), m_nRamSize(_nRamSize)
  8
  9     {
 10
 11         if (NULL != _szName)
 12
 13         {
 14
 15             size_t nSize = strlen(_szName) + 1;
 16
 17             m_szComputerName = new char[nSize];
 18
 19             strcpy_s(m_szComputerName, nSize, _szName);
 20
 21         }
 22
 23         else
 24
 25         {
 26
 27             m_szComputerName = NULL;
 28
 29         }
 30
 31     }
 32
 33
 34
 35     ~CComputerConfig()
 36
 37     {
 38
 39         if (NULL != m_szComputerName)
 40
 41         {
 42
 43             delete m_szComputerName;
 44
 45         }
 46
 47     }
 48
 49
 50
 51     CComputerConfig(const CComputerConfig& _other)
 52
 53     {
 54
 55         if (NULL == _other.m_szComputerName)
 56
 57         {
 58
 59             m_szComputerName = NULL;
 60
 61         }
 62
 63         else
 64
 65         {
 66
 67             size_t nSize = strlen(_other.m_szComputerName) + 1;
 68
 69             m_szComputerName = new char[nSize];
 70
 71             strcpy_s(m_szComputerName, nSize, _other.m_szComputerName);
 72
 73
 74
 75             m_nRomSize = _other.m_nRomSize;
 76
 77             m_nRamSize = _other.m_nRamSize;
 78
 79         }
 80
 81     }
 82
 83
 84
 85     virtual CPrototype* Clone()
 86
 87     {
 88
 89         return new CComputerConfig(*this);
 90
 91     }
 92
 93
 94
 95     virtual void Show()
 96
 97     {
 98
 99         cout<<m_szComputerName<<",Ram "<<m_nRamSize<<",Rom "<<m_nRomSize<<endl;
100
101     }
102
103
104
105     virtual void SetRam(int _nRam)
106
107     {
108
109         m_nRamSize = _nRam;
110
111     }
112
113
114
115     virtual void SetRom(int _nRom)
116
117     {
118
119         m_nRomSize = _nRom;
120
121     }
122
123 public:
124
125     char* m_szComputerName;
126
127     int m_nRomSize;
128
129     int m_nRamSize;
130
131 };
132
133  

// 客户端

 1 int _tmain(int argc, _TCHAR* argv[])
 2
 3 {
 4
 5     // ThindPad系列电脑
 6
 7     CComputerConfig computer("Thinkpad", 500, 2);
 8
 9
10
11     // 原型
12
13     CPrototype* pPrototype = &computer;
14
15     pPrototype->Show();
16
17
18
19     // ThindPad系列的2G内存版,500G硬盘版
20
21     CPrototype* p2GComputer = computer.Clone();
22
23     p2GComputer->SetRam(4);
24
25     p2GComputer->Show();
26
27
28
29     // 4G内存,1T硬盘版
30
31     CPrototype* p1TCompter = computer.Clone();
32
33     p1TCompter->SetRam(8);
34
35     p1TCompter->SetRom(1024);
36
37     p1TCompter->Show();
38
39
40
41 return 0;
42
43 }
44
45  

使用场合

  1. 两个模块A,B,模块B对外暴露一个对象C指针。而模块A需要建立很多很多C的对象,但是不需要知道具体的C是如何创建的。这个时候就应该使用原型模式。

优缺点

  1. 优点,能够降低模块间的耦合性,另外能够快速的创建新对象。

缺点,改造一个已有类型时,需要细心考虑所有成员变量拷贝的问题,容易遗漏造成错误。

参考资料

  1. 《设计模式——可复用面向对象软件基础》
  2. 《Java与模式》
  3. 《大话设计模式》

转载于:https://www.cnblogs.com/feihe0755/p/3513788.html

设计模式6——创建型模式之原型模式相关推荐

  1. 设计模式(创建型)之原型模式

    GOF 给原型模式 的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 在 C++和Java 中都提供了clone()方法来实现对象的克隆,但是在Java中必须要实现Clone ...

  2. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  3. Java设计模式学习总结(6)——创建型模式之原型模式

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式是实现了一个原型接口,该接口用于创建当前 ...

  4. 设计模式之创建型模式(工厂、原型、建造者)

    文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...

  5. 设计模式的艺术 创建型模式之原型模式

    不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学. 前言 西游记中孙悟空拔毛出分身的故事大家都知道,孙悟空根据了自己的形象创建了分身,克隆出了一个和自己几乎一模一样的身外身,设计模式 ...

  6. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  7. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  8. Java学习--设计模式之创建型模式

    一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...

  9. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  10. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

最新文章

  1. android 蓝牙通讯编程 备忘
  2. Rust基础笔记:Getting input from the console
  3. Linux/Ubuntu
  4. MySQL buffer pool中的三种链
  5. 【时间序列】最完整的时间序列分析和预测(含实例及代码)
  6. 17、document的全量替换,document的强制创建,document的删除(来源网络课程中的学习笔记)
  7. 为什么梯度反方向是函数下降最快的方向
  8. trace java_使用java动态字节码技术简单实现arthas的trace功能。
  9. (转)Eclipse在线配置Hibernate Tools
  10. IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
  11. 【渝粤教育】国家开放大学2018年春季 0064-21T20世纪欧美文学 参考试题
  12. python--getitme\setitem 支持索引与分片
  13. UFO提示写日志文件ufoerr.log 错误
  14. 突然发现一款优化神器
  15. 电脑开机一直弹计算机的界面,电脑开机总是弹出登陆窗口的解决方法
  16. Opencv识别面部
  17. 【NOI2011】bzoj2434 阿狸的打字机
  18. python短信验证码登录_Python手机验证码登录
  19. c++期末考试样例(vm)
  20. 2008福布斯400富豪榜上的大陆富豪

热门文章

  1. 【.net web】iframe小问题的解决
  2. OleCommand的SqlText占位符的问题
  3. 第 28 小时项目管理过程实践和案例分析
  4. STL priority实例
  5. UVa 11168 Airport , 凸包
  6. Ubuntu系统如何卸载并安装新版本的jdk(permission denied问题)
  7. cocos2d-x温故(三)!
  8. 用MySQL数据库来支持Schemaless的数据库存储方案
  9. shell入门基础必备
  10. 浏览器本地存储的使用