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

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

UML结构图:

 

抽象基类:

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

接口函数:

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

解析:

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

实现:

1)Prototype.h

 

[cpp] view
plain
copy

  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

 

[cpp] view
plain
copy

  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

[cpp] view
plain
copy

  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. }  
时间: 2024-07-29 06:07:22

常见设计模式解析和实现(C++)Prototype模式(原型模式)的相关文章

常见设计模式解析和实现(C++)FlyWeight模式

作用:运用共享技术有效地支持大量细粒度的对象   UML结构图:   解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套的话语敷衍别人,如"呵呵","好的"等待之类的,这些简单的答复其实每个人都是提前定义好的,在使用的时候才调用起来. Flyweight就是基于解决这种问题的思路而产生的,当需要一个可以在其他地方共享使用的对象的时候,先去查询是否已经存在了同样的对象,如果没有就生

常见设计模式解析和实现(C++)Adapt模式

作用:将一个类的接口转换成客户希望的另一个接口.Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.     UML示意图 1)      采用继承原有接口类的方式   2)采用组合原有接口类的方式   解析: Adapt模式其实就是把完成同样一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能. 实现: Adapt模式有两种实现的方法,一种是采用继承原有接口的方法,一种是采用组合原有接口类的方法,这里采用的是第二种实现方法 1)  Ad

php示例详解Constructor Prototype Pattern 原型模式_php实例

原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自己的接口 具体原型(Concrete Prototype)角色:实现一个克隆自己的操作 当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,每次都重复实例化那些相同的部分是开销很大的,而如果clone之前建立对象的那些相同的部分,就可以节约开销. 针对php的一种实现方式就是__construct()和initialize函数分开分别处理这个类的初始化,construct里面放prototype也就是公共的

.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable { } System.Collections. ICloneable public interface ICloneable { object Clone(); } System.Collect

一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable{} System.Collections. ICloneable  public interface ICloneable{ object Clone();} System.Collection

DotNet Framework源代码中的模式(六)——Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype  1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:"给我寄个快递."顾客说."寄往什么地方?寄给--?"你问.&qu

设计模式——5原型模式(Prototype)

5.原型模式(Prototype)原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中,复制对象是通过clone()实现的,先创建一个原型类:[java] view plaincopy public class Prototype implements Cloneable { public Object clone() throws CloneNot

【设计模式系列】--原型模式

在前面的博文中,小编介绍了设计模式的相关知识,今天这篇博文,咱们继续来学习设计模式的相关知识,今天小编向大家介绍的模式是原型模式,还请小伙伴多多指教,小编会从什么是原型设计模式.原型模式的结构图.原型模式的demo以及原型模式的特点和应用场景等方面一一进行介绍,希望对有需要的小伙伴有帮助. 什么是原型模式 原型模式英文名称叫Prototype,是一种创建型模式,她采用复制原型对象的方法来创建对象的实例,使用Prototype模式创建的实例,具有与原型一样的数据,我们来看一下原型模式的结构图,如下