设计模式一:单例模式

单例模式(Singleton pattern,也称单件模式)

功能:保证整个程序中,一个类只有一个实例,并提供一个访问它的全局访问点。

方法:

  1. 将构造函数私有化(用private修饰);
  2. 在类中创建一个私有的类实例;
  3. 在源文件(.cpp)中初始化2中创建的实例;
  4. 创建一个方法:ClassName *getSingeton(); 将2中创建的实例返回出来;
/*懒汉模式
    特点:
        1:请注意最后一句:Singleton* Singleton::ps = NULL; 
           这个语句实在源文件(cpp)中的,也就是实例时在被访问时才生成,这种效果称为:延迟初始化
           使用场景:如果实例对象初始化消耗很大时,这个很有用
    缺点:
        1:线程不安全,注意看方法:Instance。 如果两个线程A和B都过了 == NULL 的判断,就会导致唯一实例的规则被打破,也就是在堆中出现了连个实例,但是我们只能处理最后一个生成的实例。
        
*
//头文件  
class Singleton  
{  
    public:  
        static Singleton& Instance()                  //Instance()作为静态成员函数提供里全局访问点  
        {  
            if(ps == NULL)                        //如果还未实例化,即可实例话,反之提供实例的引用  
                ps = new Singleton;  
            return *ps;                           //返回指针的话可能会误被 delete,返回引用安全一点  
        }  
  
    private:  
        Singleton();                                  //这里将构造,析构,拷贝构造,赋值函数设为私有,杜绝了生成新例  
        ~Singleton();  
        Singleton(const Singleton&);  
        Singleton& operator=(const Singleton&);  
  
        static Singleton* ps;  
};  
  
//源文件  
Singleton* Singleton::ps = NULL;

/***************************************************************************************/
/*
    由于上面的懒汉模式存在线程安全的问题,为了解决这个问题,我们可以用线程锁来解决,如下
*/

//头文件  
class Singleton  
{  
    public:  
        static Singleton& Instance()                //Instance()作为静态成员函数提供里全局访问点  
        {  
            if(ps == NULL)  
            {     
                Lock();             //上锁  
                if(ps == NULL)          //如果还未实例化,即可实例话,反之提供实例的引用  
                    ps = new Singleton;  
                Unlock();           //解锁  
            }  
            return *ps;                             //返回指针的话可能会误被 delete,返回引用安全一点  
        }     
  
    private:  
        Singleton();                                    //这里将构造,析构,拷贝构造,赋值函数设为私有,杜绝了生成新例  
        ~Singleton();  
        Singleton(const Singleton&);  
        Singleton& operator=(const Singleton&);  
  
        static Singleton* ps;  
};  
  
//源文件  
Singleton* Singleton::ps = NULL;  

/***************************************************************************************/
/*
    模式:饿汉模式
    特点:
        1:在初始化阶段就执行
        2:不存在线程安全问题(1解决了这个问题)
    缺点:

*/

//头文件  
class Singleton  
{  
    public:  
        static Singleton& Instance()                  //Instance()作为静态成员函数提供里全局访问点  
        {  
            return instance;  
        }  
  
    private:  
        Singleton();                                  //这里将构造,析构,拷贝构造,赋值函数设为私有,杜绝了生成新例  
        ~Singleton();  
        Singleton(const Singleton&);  
        Singleton& operator=(const Singleton&);  
  
        static Singleton instance;  
};  
  
//源文件  
Singleton Singleton::instance; 

/**********************************************************************/
/*
    模式:优雅的单例模式
    特点:
        一:线程安全
        二:第一次使用时创建
*/
//头文件  
class Singleton  
{  
    public:  
        static Singleton& Instance()                  //Instance()作为静态成员函数提供里全局访问点  
        {  
            static Singleton instance;  
            return instance;  
        }  
  
    private:  
        Singleton();                                  //这里将构造,析构,拷贝构造,赋值函数设为私有,杜绝了生成新例  
        ~Singleton();  
        Singleton(const Singleton&);  
        Singleton& operator=(const Singleton&);       
}; 


 

你可能感兴趣的:(数据结构(C++))