zoukankan      html  css  js  c++  java
  • 6.对象创建型模式-单件模式

      单件模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

      单件模式实现:1.类方法Instance()提供访问实例的全局访问点。2.类构造函数声明为protected,防止直接实例化类的对象。

    将抽象工厂实现为单件的一种简单方式,客户通过Instance接口获取唯一实例:

    /* 实现为单件的抽象工厂类 */ 
    class MazeFactory {
    public:
        static MazeFactory* Instance();
        
        //existing interface goes here
    protected: 
        MazeFactory();/* 构造方法为保护,避免直接创建对象 */     
        
    private:
        static MazeFactory* _instance;
    };
    
    MazeFactory* MazeFactory::_instance = 0;
    
    /* 唯一实例的全局访问点 */ 
    MazeFactory* MazeFactory::Instance () {
        if (MazeFactory == 0) {
            _instance = new MazeFactory;
        }
        return _instance;
    }

    当单件类Singleton存在多个子类时,可以采用单件注册表的方式实现:

    /* 单件类 */
    class Singleton {
    public:
        static void Register(const char* name, Singleton* );/* 注册单件实例 */
        static Singleton* Instance();/* 获取单件实例的全局访问点 */ 
    
    protectedstatic Singleton* Lookup(const char* name);
    
    private:
        static Singleton* _instance;        
        static List<NameSingletonPair>* _registry;/* 单件注册表 */             
    };
    
    /* 单件实例全局访问点的实现:通过查_redistry表获取合适的单件实例 */ Singleton* Singleton::Instance () { if (_instance == 0) { /* 使用环境变量来提供单件实例的名字,也可以参数化Instance方法 */ const char* singletonName = getenv("SINGLETON"); _instance = Lookup(singletonName); } return _instance; }

    /* MySingleton类注册自己,可以在类的构造器中 */ MySingleton::MySingleton() { Singleton::Register("MySingleton", this); }

    /* 客户在定义单件类的文件中,使用static关键字实例化单件类,使得实例化的对象在文件外部不可见 */ static MySingleton theSingleton;
  • 相关阅读:
    Android studio USB连接失败
    BZOJ 1013 [JSOI2008]球形空间产生器sphere
    UVA1025
    noip2016天天爱跑步
    noip2015运输计划
    noip2012借教室
    BZOJ 1597: [Usaco2008 Mar]土地购买
    BZOJ1010: [HNOI2008]玩具装箱toy
    BZOJ1026: [SCOI2009]windy数
    BZOJ1801:[Ahoi2009]chess 中国象棋
  • 原文地址:https://www.cnblogs.com/VincentXu/p/3348635.html
Copyright © 2011-2022 走看看