zoukankan      html  css  js  c++  java
  • 设计模式学习系列1 单例模式

    为什么学习单例模式,因为单例模式用的比较广泛,游戏客户端的配置文件读取类,服务器日志类等等,都是使用单例模式来实现,单例模式也即是保证类只有一个实例,并且访问类全局的接口,这种方法可以使用全局来实现,但不能保证只存在一个,最好的办法是类中做限制,现在单例模式的实现方法有两种,一种称为饿汉式,类加载的时候就初始化,另外一种是懒汉式,在使用的时候创建对象

    1懒汉模式指针版本

    class singletonP
     {
         //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 
     private:
         singletonP(){str = "懒汉模式 使用指针注意释放问题哦";}
         ~singletonP(){};    // 析构的时候不会调用 
        static singletonP * pSingle ;
        string str ;
        
        class CGarbo   //它的唯一工作就是在析构函数中删除singletonP的实例  
        {  
        public:  
            ~CGarbo()  
            {  
                if(singletonP::pSingle)  
                    delete singletonP::pSingle;  
            }  
        };  
        static CGarbo Garbo;  //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数  
    public: 
    //    ~singletonP();    
        // 获得类方法的接口,在第一次使用的时候创建 
        static singletonP* GetSingletonP() 
        {
            if(pSingle == NULL)       //多线程情况下需要双重锁定 
                    pSingle = new singletonP() ;
            return pSingle ; 
        }
        
        void printNum()
        {
            cout << str << "
    " << endl ;            
        }
     };
    

    这种写法需要注意释放问题,因为静态变量和全局变量一样实在系统结束的时候系统释放,利用这个特征,建一个局部类,专门用来释放需要师范的参数

    2懒汉模式静态局部变量
    class singletonA
     {
         //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 
     private:
         singletonA()
         {
            str = "局部变量懒汉模式" ;    
        }  
        ~singletonA()
        {
            
        } 
    
        singletonA(const singletonA& single);
        singletonA operator=(const singletonA& single);        
        string str ; 
    public:
        // 获得类方法的接口,在第一次使用的时候创建 
        static singletonA* GetSingletonA()
        {
            static singletonA SingleClass;
            return &SingleClass ; 
        }
        
        void printNum()
        {
            cout << str << "
    " << endl ;            
        }
     };

    这种方法是用的比较多的,其中构造函数,赋值函数全部私有化,只提供局部静态的返回接口

    3饿汉模式

    class singletonE
     {
         //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 
     private:
         singletonE()
         {
            str = "饿汉模式注意多线程中的锁哦";    
        }  
        ~singletonE()
        {
            
        } 
        static singletonE SingleClass ;
        string str ;
    public:
        
        static singletonE* GetSingletonE()
        {
            return &SingleClass ; 
        }
        
        void printNum()
        {
            cout << str << "
    " << endl ;            
        }
     };

    4单例模式总结

    对于线程安全,还有一种双重锁的写法

    单例模式使用静态变量,如果出现互相之间的调用需要注意初始化顺序等问题

    可以参考的文章:

    懒汉模式

    最优单例模式

    Technorati 标签:
  • 相关阅读:
    (转载)构建public APIs与CORS
    SpringMVC 参数注入
    java删除文件夹
    idea 自动提示生成 serialVersionUID
    JSP自定义tag
    gradle中使用嵌入式(embedded) tomcat, debug 启动
    spring in action 4th --- quick start
    Date, TimeZone, MongoDB, java中date的时区问题
    spring boot 添加拦截器
    HTTP status code
  • 原文地址:https://www.cnblogs.com/zsb517/p/3403767.html
Copyright © 2011-2022 走看看