zoukankan      html  css  js  c++  java
  • 常见设计模式解析和实现(C++)Prototype模式(原型模式)

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

    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 ";  
    7. }  
    8.   
    9.   
    10. ConcreatePrototype1::~ConcreatePrototype1()  
    11. {  
    12.     std::cout << "destruction of ConcreatePrototype1 ";  
    13. }  
    14.   
    15. ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)  
    16. {  
    17.     std::cout << "copy construction of ConcreatePrototype1 ";  
    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 ";  
    30. }  
    31.   
    32.   
    33. ConcreatePrototype2::~ConcreatePrototype2()  
    34. {  
    35.     std::cout << "destruction of ConcreatePrototype2 ";  
    36. }  
    37.   
    38. ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)  
    39. {  
    40.     std::cout << "copy construction of ConcreatePrototype2 ";  
    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. }  
  • 相关阅读:
    python yield yield from
    python isinstance()与type()的区别
    python isinstance用法
    python 展开嵌套的序列
    python getmtime() 最近修改文件内容的时间
    python getctime() 文件最后一次的改变时间
    python getatime() 查看文件的访问时间
    python模拟随机游走
    getopt例子
    matplotlib 代码风格
  • 原文地址:https://www.cnblogs.com/redrainblog/p/4209734.html
Copyright © 2011-2022 走看看