剑指offer 关于单例模式

来源:互联网 发布:淘宝网改地址怎么改 编辑:程序博客网 时间:2024/05/22 01:59

为什么会有单例模式?

典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问。比如窗口管理器,打印缓冲池和文件系统

在单例模式之前,先说一下为什么不使用一个全局变量来代替单例模式

全局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不安全隐患,特别是在多线程程序中,会有很多的不可预测性;

同时,使用全局变量,也不符合面向对象的封装原则。


针对C++

/***********************************剑指offer面试题2:实现单例模式**语言:C++**Writted by XRJ on 2017/10/22************************************/#include <iostream>using namespace std;//第一种方法,考虑到多线程问题,“双检锁机制”,并使用内部类的静态实例达到自动释放内存的目的class MySingleton1{public:MySingleton1 *getinstance(){//此处进行了两次m_Instance == NULL的判断,是借鉴了Java的单例模式实现时,使用的所谓的“双检锁”机制。//因为进行一次加锁和解锁是需要付出对应的代价的,而进行两次判断,就可以避免多次加锁与解锁操作,同时也保证了线程安全。if(myinstace1 == NULL){lock();if (myinstace1 == NULL){//防止new分配内存出现问题std::bad_alloctry{myinstace1 = new MySingleton1();}catch (...){myinstace1 = NULL;}}unlock();}return myinstace1;}private://构造函数私有化MySingleton1(){}//私有指针,指向一个MySingleton1的实例static MySingleton1 *myinstace1;class GC{private:~GC(){if (myinstace1 != NULL){delete myinstace1;myinstace1 == NULL;}}};//程序结束时自动释放静态成员变量,所以肯定会调用GC的析构函数,达到自动释放单例的目的static GC gc;};//类外初始化为空指针MySingleton1 *MySingleton1::myinstace1 = NULL;//第二种方法,直接初始化一个静态对象返回其引用,无需考虑内存释放class MySingleton2{public:MySingleton2 *getinstance(){//程序结束时自动释放静态成员变量static MySingleton2 myinstace2;return &myinstace2;}private:MySingleton2(){}};



针对C#,由于其本身有一个C++没有的静态构造函数,可以直接

static MySingleton myinstace1 = new Singleton();

这样,C#会调用静态构造函数来初始化静态变量,而.NET运行时能够确保只调用一次静态构造函数,这样我们就能够保证只初始化一次instance。

      1: 静态构造函数既没有访问修饰符,也没有参数。
      2:在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

      3:只调用一次


后面遇到更好的模式实现方式,会再分享修改~


原创粉丝点击