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

时间:2022-09-06 18:38:25

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

UML结构图:

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

 

抽象基类:

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. }