设计模式-单例模式 - 技术分享 - 志盟培训
首页技术分享 设计模式-单例模式

设计模式-单例模式

更新时间:2017-05-19      作者:吴老师       阅读:762

有一些对象其实我们只需要一个,比方说:线程池、缓存、显卡等设备的驱动程序的对象。实际上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。

许多时候,通过程序员之间的约定也可以办到只创建一个对象。但如果有更好的办法,大家应该都乐意接受,单例模式是一个经得起时间考验的方法,可以确保只有一个实例被创建,和全局变量一样方便,又没有全局变量的缺点。比如在一开始创建了对象,但是整个程序都没有用到这个对象,就会形成浪费。

c++中,我们知道静态成员变量是唯一的变量,所以我们可以通过静态成员来写出单例模式的实现。用到的方法是,将构造函数设为私有的,这样,普通的方法想要创建一个对象是不能实现的。那么我们需要的唯一一个实例怎么创建呢?我们可以写一个公有的静态函数来创建对象。

可以看代码来了解一下:

class Singleton {

public:

           static Singleton* getInstance();

private:

           Singleton();

           //防止被复制

           Singleton(const Singleton&);

           Singleton& operator=(const Singleton&);

           static Singleton* instance;

};


静态变量的初始化:

Singleton* Singleton::instance = NULL;

Singleton* Singleton::getInstance()  {

           if (instance == NULL)

                     instance = new Singleton;

           return instance;

}

但是这种写法是不安全的,没有使用实例的时候,instance是NULL,一旦使用,就创建一个实例,看似没什么问题,实际上如果在多线程的情况下,又可能两个线程都判断出了instance是NULL,于是创建两个实例,这样就没办法保证安全性,我们可以在这里加锁:

Singleton* Singleton::getInstance()  {

         if (instance == NULL)

         {

                    pthread_mutex_lock(&mutex);

                    if (instance == NULL)

                              instance = new Singleton;

                    pthread_mutex_unlock(&mutex);

         }

         return instance;

}

之所以这样写,是因为如果每次获得实例的时候都加锁,效率比较低,只有判断了指针为NULL,才需要加锁。

当然,我们也可以在初始化的时候就创建一个对象:

Singleton* Singleton::instance = new Singleton;

Singleton* Singleton::getInstance()  {

          return instance;

}

两种写法在时间和空间上有所不同,这个大家可以自己体会一下。

这样,在主函数里,我们可以判断一下是不是只有一个实例:

int main()

{

          Singleton* s1 = Singleton::getInstance();

          Singleton* s2 = Singleton::getInstance();

           if (s1 == s2)

                    cout  << "s1 == s2" <<endl;

}

在线报名

志盟科技上海招聘

在线报名 联系我们

志盟科技深圳招聘

在线报名 联系我们

志盟科技北京招聘

在线报名 联系我们
联系我们

咨询热线:

咨询 QQ:517578         

就业学员

  • 就业学员

    姓名:郭凡凡 
    院校:阜阳师范学院
    就职:佳戴
    职位:软件工程师
    月薪:10000

  • 就业学员

    姓名:陈祥龙 
    院校:中北大学
    就职:美囤妈妈
    职位:软件工程师
    月薪:9000

  • 就业学员

    姓名:陈建伟
    院校:南昌航空大学
    就职:SONY
    职位:嵌入式工程师
    月薪:8000

×
×
  • *真实姓名
  • *联系手机
  • *上课地址
  •    QQ号码

温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。

×
  • *真实姓名
  • *联系手机
  • *联系邮箱
  • * QQ号码

温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一的服务。

本站由 宽敬科技——创新企业的建站运营顾问 提供支持