【C++设计模式】单例模式
单例模式:保证一个类仅有一个实例
定义一个单例类:
1.私有化构造函数,以防止外界创建单例对象
2.用类的私有静态指针变量指向类的唯一实例
3.使用公有的静态方法获取实例
C++11规定了local static在多线程条件下的初始化行为,要求编译器保证了内部静态变量的线程安全性。在C++11标准下,《Effective C++》提出了一种更优雅的单例模式实现,使用函数内的 local static 对象。这样,只有当第一次访问getInstance()
方法时才创建实例。这种方法也被称为Meyers' Singleton。
懒汉式
class Singleton { private: //构造函数私用化 Singleton() {}; ~Singleton() {}; Singleton(const Singleton&); Singleton& operator=(const Singleton&); public: //保证线程安全性 static Singleton& getInstance() { static Singleton instance; return instance; } };
饿汉式
class Singleton { private: static Singleton instance; private: //构造函数私用化 Singleton() ; ~Singleton(); Singleton(const Singleton&); Singleton& operator=(const Singleton&); public: static Singleton& getInstance() { return instance; } }; //初始化的地方 Singleton Singleton::instance;
总结:
饿汉式虽然是线程安全的,懒汉式通常需要加锁来保证线程安全,但局部静态变量版本在C++11后是线程安全的。
c#里面的延迟初始化:
Lazy<T> 对象初始化默认是线程安全的,在多线程环境下,第一个访问 Lazy<T> 对象的 Value 属性的线程将初始化 Lazy<T> 对象,以后访问的线程都将使用第一次初始化的数据。