1.意图

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

2.动机

通过拷贝或者“克隆”一个类的实例来创建新的实例。

3.适用性

当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及

  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
  • 为了避免创建一个与产品类层次平行的工厂类层次时或者
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

4.结构

5.代码实例

  1. #include <memory>
  2.  
  3. class Prototype
  4. {
  5. public:
  6. virtual std::shared_ptr<Prototype> Clone() = ;
  7. virtual void PrintState() = ;
  8. virtual void SetState(int state) = ;
  9. };
  10.  
  11. class ConcretePrototype1 : public Prototype
  12. {
  13. public:
  14. ConcretePrototype1(int state);
  15. std::shared_ptr<Prototype> Clone();
  16. void PrintState();
  17. virtual void SetState(int state);
  18. private:
  19. int m_iState;
  20. };
  21.  
  22. class ConcretePrototype2 : public Prototype
  23. {
  24. public:
  25. ConcretePrototype2(int state);
  26. std::shared_ptr<Prototype> Clone();
  27. void PrintState();
  28. virtual void SetState(int state);
  29. private:
  30. int m_iState;
  31. };

Prototype.h

  1. #include<map>
  2. #include<memory>
  3.  
  4. class Prototype;
  5.  
  6. class ProtoTypeFactory
  7. {
  8. public:
  9. void RegisterPrototype(int key,std::shared_ptr<Prototype> pProtoType);
  10. std::shared_ptr<Prototype> GetProtoType(int key);
  11. void PrintAllPrototypeState();
  12. private:
  13. std::map<int,std::shared_ptr<Prototype>> m_ProtoTypeMap;
  14. };

ProtoTypeFactory.h

  1. #include "Prototype.h"
  2. #include <iostream>
  3.  
  4. ConcretePrototype1::ConcretePrototype1(int state) : m_iState(state)
  5. {
  6. }
  7.  
  8. std::shared_ptr<Prototype> ConcretePrototype1::Clone()
  9. {
  10. std::shared_ptr<Prototype> pProtoType(new ConcretePrototype1(*this));
  11.  
  12. return pProtoType;
  13. }
  14.  
  15. void ConcretePrototype1::PrintState()
  16. {
  17. std::cout << " ConcretePrototype1 State is :" << m_iState <<std::endl;
  18. }
  19.  
  20. void ConcretePrototype1::SetState(int state)
  21. {
  22. m_iState = state;
  23. }
  24.  
  25. ConcretePrototype2::ConcretePrototype2(int state) : m_iState(state)
  26. {
  27. }
  28.  
  29. std::shared_ptr<Prototype> ConcretePrototype2::Clone()
  30. {
  31. std::shared_ptr<Prototype> pProtoType(new ConcretePrototype2(*this));
  32.  
  33. return pProtoType;
  34. }
  35.  
  36. void ConcretePrototype2::PrintState()
  37. {
  38. std::cout << " ConcretePrototype2 State is :" << m_iState <<std::endl;
  39. }
  40.  
  41. void ConcretePrototype2::SetState(int state)
  42. {
  43. m_iState = state;
  44. }

Prototype.cpp

  1. #include "ProtoTypeFactory.h"
  2. #include "Prototype.h"
  3. #include <utility>
  4.  
  5. void ProtoTypeFactory::RegisterPrototype(int key,std::shared_ptr<Prototype> pProtoType)
  6. {
  7. m_ProtoTypeMap[key] = pProtoType;
  8. }
  9.  
  10. std::shared_ptr<Prototype> ProtoTypeFactory::GetProtoType(int key)
  11. {
  12. auto iter = m_ProtoTypeMap.find(key);
  13. return iter->second;
  14. }
  15.  
  16. void ProtoTypeFactory::PrintAllPrototypeState()
  17. {
  18. for(auto iter = m_ProtoTypeMap.begin(); iter != m_ProtoTypeMap.end();++iter)
  19. {
  20. iter->second->PrintState();
  21. }
  22. }

ProtoTypeFactory.cpp

  1. #include "ProtoTypeFactory.h"
  2. #include "Prototype.h"
  3. #include <iostream>
  4.  
  5. void RegisterPrototype(std::shared_ptr<ProtoTypeFactory> pProtoTypeFactory)
  6. {
  7. std::shared_ptr<Prototype> pConcretePrototype1(new ConcretePrototype1());
  8. std::shared_ptr<Prototype> ConcretePrototype2(new ConcretePrototype2());
  9. pProtoTypeFactory->RegisterPrototype(,pConcretePrototype1);
  10. pProtoTypeFactory->RegisterPrototype(,ConcretePrototype2);
  11. }
  12.  
  13. int main()
  14. {
  15. std::shared_ptr<ProtoTypeFactory> pProtoTypeFactory(new ProtoTypeFactory());
  16.  
  17. std::cout<< "RegisterPrototype in PrototypeFactory";
  18. std::cout << std::endl;
  19. std::cout << std::endl;
  20. std::cout << std::endl;
  21.  
  22. RegisterPrototype(pProtoTypeFactory);
  23.  
  24. std::cout<< "Print All State in PrototypeFactory:" << std::endl;
  25. pProtoTypeFactory->PrintAllPrototypeState();
  26.  
  27. std::cout<< "Clone Prototype 1:" << std::endl;
  28. auto pProtoType = pProtoTypeFactory->GetProtoType();
  29. std::cout<< "Print State Before Set State" << std::endl;
  30. auto pClonedProtoType = pProtoType->Clone();
  31. pClonedProtoType->PrintState();
  32. std::cout<< "Print State After Set State" << std::endl;
  33. pClonedProtoType->SetState();
  34. pClonedProtoType->PrintState();
  35.  
  36. std::cout << std::endl;
  37. std::cout << std::endl;
  38. std::cout << std::endl;
  39.  
  40. std::cout<< "Clone Prototype 2:" << std::endl;
  41. pProtoType = pProtoTypeFactory->GetProtoType();
  42. std::cout<< "Print State Before Set State" << std::endl;
  43. pClonedProtoType = pProtoType->Clone();
  44. pClonedProtoType->PrintState();
  45. std::cout<< "Print State After Set State" << std::endl;
  46. pClonedProtoType->SetState();
  47. pClonedProtoType->PrintState();
  48.  
  49. std::cout << std::endl;
  50. std::cout << std::endl;
  51. std::cout << std::endl;
  52.  
  53. std::cout<< "Print All State in PrototypeFactory:" << std::endl;
  54. pProtoTypeFactory->PrintAllPrototypeState();
  55.  
  56. while();
  57.  
  58. }

Test.cpp

6.测试结果

利用原型设计模式时,可以预先注册所需的原型,然后在使用时根据原型创建实例。

7.效果

  • 运行时刻增加和删除产品,Prototype允许只通过注册原型实例就可以将一个新的具体产品类并入系统。
  • 改变值以指定新对象
  • 改变结构以指定新对象
  • 减少子类的构造
  • 用类动态配置应用。

ProtoType(原型)-对象创建型模式的更多相关文章

  1. Prototype原型(创建型模式)

    依赖关系的倒置:抽象不应该依赖于实现的细节,实现细节应该依赖于抽象. 原型模式的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.prototype模式允许一个对象再创建另外一个可 ...

  2. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  3. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  4. 5.对象创建型模式-原型PROTOTYPE

    原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型实现:1.用于创建对象的具体类必须实现clone()操作,用于对象克隆自己以生成新的对象.下面通过原型来实现一个抽象工厂Ma ...

  5. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  6. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  7. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  8. Builder(生成器)-对象创建型模式

    一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...

  9. 对象创建型模式------Builder(生成器)

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

随机推荐

  1. 修改使用phpstorm创建的模板的默认注释

     

  2. 一些关于HTTP协议、表单和……的备忘

    几个概念 Ajax是一种技术.asp.net是一个库.json是一种数据格式.jquery是js的库(源码).ror是ruby on rails.python,就是python.Ajax和AJAX,后 ...

  3. HTML 参考手册

    按字母顺序排列 New : HTML5 中的新标签. 标签 描述 <!--...--> 定义注释. <!DOCTYPE>  定义文档类型. <a> 定义锚. < ...

  4. 【python】类中@property使用

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  5. 墨菲定律-Murphy's Law (转载)

    墨菲定律 “墨菲定律”(Murphy's Law)亦称莫非定律.莫非定理.或摩菲定理,是西方世界常用的俚语. “墨菲定律”:事情往往会向你所想到的不好的方向发展,只要有这个可能性.比如你衣袋里有两把钥 ...

  6. 无线路由器WDS简要

    A,B两台无线路由器,B去桥接A.在B中保持A相同的无线信道.在B中关闭DHCP.--A,B两台的SSID和无线安全设置都是独立的,无线安全可同可不同.

  7. WebApi:使用方法名或者控制器名作为接口地址

    今天遇到一个问题:新建的WebApi的项目生成的接口的地址都是以控制器的名字命名的,这样的话,在方法前添加ActionName就不起作用了,但之前一个项目是可以的. 接口代码: public clas ...

  8. VS2010快捷键大全

    VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O ...

  9. IOS跳转设置页面及其他各种跳转页面设置

    转载来源 CocoaChina 跳到更多设置界面 除了跳到WiFi设置界面,能不能跳到其他的设置界面呢?比如:定位服务.FaceTime.音乐等等.都是可以的,一起来看看如何实现的! 定位服务 定位服 ...

  10. 2. xargs 命令

    1.简介 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是 ...