单例模式

Posted joezzz

tags:

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

1.概念

1)单例模式就是一个类只能被实例化一次 ,更准确的说是只能有一个实例化对象的类

2)为什么要有单例模式:一则,解决多线程并发访问的问题;二则节约系统资源

  • 例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的打印任务
  • 如在Windows中就只能打开一个任务管理器,如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态

3)

2.实现代码

class CSingleton {    //懒汉模式
private:
    CSingleton()//把构造函数设为private,不让外界直接生成实例
    {
        pthread_mutex_init(&mtx, 0);
    }
    static CSingleton* p;
public:
    static pthread_mutex_t mtx;
    static CSingleton* getInstance()//外界通过调用这个public函数去获得实例
    {
        if (p == NULL)//只实例化一次
        {
            pthread_mutex_lock(&mtx); //如果两个线程同时获取实例化对象,这样就会造出两个实例了,所以要加锁
            p = new CSingleton();
            pthread_mutex_unlock(&mtx);
        }
        else
            return p;
    }
};
pthread_mutex_t CSingleton::mtx;
CSingleton* CSingleton::p = NULL;



class CSingleton {    //饿汉模式,不用加锁
private:
    CSingleton(){}
    static CSingleton *p;
public:
    static CSingleton* getInstance()
    {
        return p;
    }
};
CSingleton* CSingleton::p = new CSingleton();//在外界会调用 CSingleton::getInstance()之前这个类就已经被实例化了,所以不会出现多线程的安全问题

 

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

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块