设计模式学习系列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 标签:
原文地址:https://www.cnblogs.com/zsb517/p/3403767.html