设计模式之单例模式

Posted Seven_noon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之单例模式相关的知识,希望对你有一定的参考价值。

单例模式是在使用类时,只会实例化出一个对象。

实现单例模式有两种方式:1. 懒汉模式 2. 饿汉模式。

懒汉模式指的是只有当需要使用到对象时才会取实例化,而饿汉模式则是一开始就实例化出对象。

  • 懒汉模式
class SingleInstan{
    static SingleInstan* instance;
    SingleInstan(){}
    SingleInstan(SingleInstan &a)=delete;      
public:
    SingleIntan* getInstan(){
        if(instance==NULL){
            instance=new SingleInstan();
        }
        return instance;
    }
};
SingleInstan::instance=NULL;

其中构造函数为私有,并且禁止默认拷贝构造函数生成,获取对象只能通过getInsta()。

  • 饿汉模式

 

class SingleInstan{
    static SingleInstan *instance;
    SingleInstan(){}
    SingleInstan(SingleInstan &a)=delete;
public:
    static getInstan(){
        return instance;
    }
};
SingleInstan::instance=new SingleInstan();

直接实例化对象。

 

上述中的懒汉模式是多线程不安全的一个实现。

如何实现一个线程安全的单例模式呢?我们有两种方式。

struct Lock{
    pthread_mutex_t mutex;
    Lock(){
        pthread_mutex_init(&mutex);
    }
};
class SingleInstan{
    static SingleInstan *instance;
    SingleInstan(){}
    SingleInstan(SingleInstan &a)=delete;
public:
    static SingleInstan* getInstan(Lock lock){
        pthread_mutex_lock(&(lock.mutex));
        if(instance==NULL){
            instance=new SingleInstan();
         }
        pthread_mutex_unlock(&(lock.mutex));
        return instance;
    }
};

这里用到一个互斥锁来保证线程安全,而且只用了一层判断,其实可以外面再加一层if(instance==NULL)的判断,可以优化性能。

另一种是使用局部静态变量,非常简洁

class SingleInstan{
    SingleInstan(){}
    SingleInstan(const SingleInstan &a=delete;
public:
    static SingleInstan& getInstan(){
        static SingleInstan instance();
        return instance;
    }
};

 

以上是关于设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

Java设计模式之单例模式

设计模式之单例模式以及简单代码实现

设计模式之单例设计模式

设计模式之单例模式

设计模式之单例模式