常见设计模式解析和实现(C++)Prototype模式(原型模式)-阿里云开发者社区

开发者社区> redrain.> 正文

常见设计模式解析和实现(C++)Prototype模式(原型模式)

简介: 作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 UML结构图:   抽象基类: 1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1)  Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象。
+关注继续查看

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

UML结构图:


 

抽象基类:

1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数

接口函数:

1)  Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象。

解析:

Prototype模式其实就是常说的“虚拟构造函数”的一个实现,C++的实现机制中并没有支持这个特性,但是通过不同派生类实现的Clone接口函数可以完成与“虚拟构造函数”同样的效果。举一个例子来解释这个模式的作用,假设有一家店铺是配钥匙的,他对外提供配钥匙的服务(提供Clone接口函数),你需要配什么钥匙它不知道只是提供这种服务,具体需要配什么钥匙只有到了真正看到钥匙的原型才能配好。也就是说,需要一个提供这个服务的对象,同时还需要一个原型(Prototype),不然不知道该配什么要的钥匙。

实现:

1)Prototype.h

 

  1. #ifndef PROTOTYPE_H  
  2. #define PROTOTYPE_H  
  3.   
  4. // 虚拟基类,所有原型的基类,提供Clone接口函数  
  5.   
  6.   
  7. class Prototype  
  8. {  
  9. public:  
  10.     prototype(){}  
  11.     virtual ~Prototype(){}  
  12.   
  13.     virtual Prototype *Clone() = 0;  
  14. };  
  15.   
  16.   
  17.   
  18. // 派生自Prototype,实现Clone方法  
  19. class ConcreatePrototype1:public Prototype  
  20. {  
  21. public:  
  22.     ConcreatePrototype1();  
  23.     ConcreatePrototype1(const ConcreatePrototype1&);  
  24.     virtual ~ConcreatePrototype1();  
  25.   
  26.     virtual Prototype* Clone();  
  27. };  
  28.   
  29. // 派生自Prototype,实现Clone方法  
  30. class ConcreatePrototype2:public Prototype  
  31. {  
  32. public:  
  33.     ConcreatePrototype2();  
  34.     ConcreatePrototype2(const ConcreatePrototype2&);  
  35.     virtual ~ConcreatePrototype1();  
  36.   
  37.     virtual Prototype* Clone();  
  38. };  
  39.   
  40. #endif  

 (2)Prototype.cpp

 

  1. #include "Prototype.h"  
  2. #include <iostream>  
  3.   
  4. ConcreatePrototype1::ConcreatePrototype1()  
  5. {  
  6.     std::cout << "construction of ConcreatePrototype1\n";  
  7. }  
  8.   
  9.   
  10. ConcreatePrototype1::~ConcreatePrototype1()  
  11. {  
  12.     std::cout << "destruction of ConcreatePrototype1\n";  
  13. }  
  14.   
  15. ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)  
  16. {  
  17.     std::cout << "copy construction of ConcreatePrototype1\n";  
  18. }  
  19.   
  20. Prototype* ConcreatePrototype1::Clone()  
  21. {  
  22.     return new ConcreatePrototype1(*this);  
  23. }  
  24.   
  25.   
  26.   
  27. ConcreatePrototype2::ConcreatePrototype2()  
  28. {  
  29.     std::cout << "construction of ConcreatePrototype2\n";  
  30. }  
  31.   
  32.   
  33. ConcreatePrototype2::~ConcreatePrototype2()  
  34. {  
  35.     std::cout << "destruction of ConcreatePrototype2\n";  
  36. }  
  37.   
  38. ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)  
  39. {  
  40.     std::cout << "copy construction of ConcreatePrototype2\n";  
  41. }  
  42.   
  43. Prototype* ConcreatePrototype2::Clone()  
  44. {  
  45.     return new ConcreatePrototype2(*this);  
  46. }  
(3)main.cpp

  1. #include "Prototype.h"  
  2. #include <stdio.h>  
  3.   
  4.   
  5.   
  6. int main()  
  7. {  
  8.     Prototype* pPrototype1 = new ConcreatePrototype1();  
  9.     Prototype* pPrototype2 = pPrototype1->Clone();  
  10.   
  11.     Prototype* pPrototype3 = new ConcreatePrototype2();  
  12.     Prototype* pPrototype4 = pPrototype3->Clone();  
  13.   
  14.     delete pPrototype1;  
  15.     delete pPrototype2;  
  16.     delete pPrototype3;  
  17.     delete pPrototype4;  
  18. }  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《设计模式解析(第2版•修订版)》—第1章 1.5节应对需求变更
为了找出解决需求变更问题的办法,弄清功能分解有没有其他替代方法,我们先来看看日常生活中人们是如何做事的。假设你是要在一个会议1上担任讲师,听课的人在课后还要去听其他课,但他们不知道下一堂课的听课地点。你的责任之一,就是确保大家都知道下一堂课去哪里上。
1334 0
《设计模式解析(第2版•修订版)》—第1章 1.7节面向对象程序设计实践
对象对自己行为所负的责任越多,控制程序需要负的责任就越少。封装使对象内部行为的变化对其他对象变得透明了。封装有助于防止不良副作用。
1339 0
C#解析json文件的方法
C# 解析 json   JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。 JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。
1359 0
《设计模式解析(第2版•修订版)》—第1章 1.8节特殊对象方法
所有面向对象语言都会在对象删除时查找并执行相应的析构函数。与构造函数一样,析构函数的使用也是对象“自己负责自己”所要求的。
1188 0
深入理解设计模式!六大设计原则的分析与介绍
本篇文章开始介绍程序架构设计中的设计模式,介绍了设计模式的基本概念以及23设计模式。主要介绍了设计模式中的六大设计原则。开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,迪米特原则和合成复用原则。这几大原则是设计模式使用的基础,在使用设计模式时,应该牢记这六大原则。
60 0
JavaScript创建对象(四)——组合使用构造函数和原型模式
在JavaScript创建对象(三)——原型模式中,我们阐述了原型模式存在的两个问题:一是没办法通过构造函数初始化对象属性,二是共享引用类型的数据导致数据错乱。
825 0
23种设计模式全解析
一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
498 0
常见设计模式解析和实现(C++)Adapt模式
作用:将一个类的接口转换成客户希望的另一个接口。Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。     UML示意图 1)      采用继承原有接口类的方式   2)采用组合原有接口类的方式   解析: Adapt模式其实就是把完成同样一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能。
746 0
+关注
redrain.
世上最可怕的事情就是比你优秀的人同时比你更努力!
93
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载