创建型模式分析.pptVIP

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
附:类的静态成员(类操作) 在单件模式中,方法Instance被标记为Static,内部变量UniqueInstance也被标记为Static,这些称为类的静态成员。 静态成员和类的一般成员有什么区别? 模式的优点 1、对唯一实例的受控访问:因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。 2、缩小名空间:Singleton模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名空间。 3、允许对操作和表示的精化:Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。 4、允许可变数目的实例:这个模式允许Singleton类的多个实例。 5、比类操作更灵活:另一种封装单件功能的方式是使用类操作,但这类技术难以改变设计以允许一个类有多个实例。此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。 模式的实现 1、保证一个唯一的实例:做到这一点的一个常用方法是将创建这个实例的操作隐藏在一个类操作(即一个静态成员函数或者是一个类方法)后面,由它保证只有一个实例被创建。 class Singleton { public: static Singleton* Instance(); //静态方法,客户访问Singleton的唯一入口 protected: //受保护的构造器,确保用户无法直接实例化Singleton对象 Singleton(); private: static Singleton* _instance; //静态成员 }; Singleton* Singleton::_instance = 0; Singleton* Singleton::Instance () { if (_instance == 0) { _instance = new Singleton; } //Lazy initialization return _instance; } 模式的实现(续) 2、创建Singleton类的子类,即指向单件实例的变量必须用Singleton的子类的实例进行初始化: 最简单的技术是在Singleton的Instance操作中决定想使用的是哪一个单件。 另一个选择Singleton的子类的方法是将Instance的实现从父类中分离出来并将它放入子类。 使用条件语句在Instance中选择子类。 一个更灵活的方法是使用一个单件注册表(registry of singleton)。可能的Singleton类的集合不是由Instance定义的, Singleton类可以根据名字在一个众所周知的注册表中注册它们的单件实例。 2、模式的例子 class MazeFactory { public: static MazeFactory* Instance(); // existing interface goes here protected: MazeFactory(); private: static MazeFactory* _instance; }; MazeFactory* MazeFactory::_instance = 0; // MazeFactory::Instance的标准实现,只能创建当前类的单件 MazeFactory* MazeFactory::Instance () { if (_instance == 0) { _instance = new MazeFactory; } return _instance; } 创建单件的子类 //Instance的扩展实现,可以创建当前类的派生类的单件 MazeFactory* MazeFactory::Instance () { if (_instance == 0) { const char* mazeStyle = getenv(“MAZESTYLE”); //获得工厂类型 if (strcmp(mazeStyle, bombed) == 0) { _instance = new BombedMazeFactory; } else if (strcmp(mazeStyle, enchanted) == 0) { _instance = new EnchantedMazeFactory; } else { // default _instance = new MazeFa

文档评论(0)

四娘 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档