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

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

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

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. }  
目录
相关文章
|
6天前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
29 6
|
6天前
|
设计模式 Java 关系型数据库
设计模式第2弹:工厂方法模式
type ComputerProduct struct{} // 实现工厂方法 func (computer ComputerProduct) GetInformation() string { return "电脑,官方称呼计算机,主要用于进行数据运算的一台机器。" }
21 4
|
6天前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
17 5
|
7天前
|
设计模式 架构师 NoSQL
设计模式-工厂方法模式和抽象工厂模式
 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
185 0
|
13天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
14天前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
23 2
|
14天前
|
存储 算法 C++
C++中的函数深入解析
C++中的函数深入解析
18 2
|
14天前
|
C++
C++ 类的访问修饰符:深入解析
C++ 类的访问修饰符:深入解析
10 1
|
18天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
20天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)

热门文章

最新文章

推荐镜像

更多