标签:effect main cal prot man delete lock protect gets
单例模式
单例模式:创建一个需要使用的对象。这里先分析为什么要用类来创建,本来可以创建一个non-local静态对象。就是在main函数之前创建 T a();这个对象。但是非局部静态对象一般由“模版隐式具体化”形成,在多个编译单元内,它的初始化顺序未知(effective c++ 4th)。所以用class方法的形式来构建一个单例模式。
首先单例模式分为饿汉式和懒汉式。
饿汉:很饿,很着急,需要尽早的构建对象。对象式提前构建好的。
懒汉:很懒,不着急,当对象需要用的时候,才构建对象。
1.饿汉式。
1 class Singleton{ 2 private: 3 Singleton(){} 4 Singleton(const Singleton & ); 5 Singleton& operator=(const Singleton& ); 6 static Singleton* ptr; 7 public: 8 Singleton* GetSingleton(){ 9 return ptr; 10 } 11 void deleteSingleton(){ 12 if(ptr!=nullptr){ 13 delete ptr; 14 ptr=nullptr; 15 } 16 } 17 }; 18 Singleton* Singleton::ptr=new Singleton();
2.懒汉式
1 /* 2 class Uncopyable 3 protected: 4 Uncopyable() {} 5 ~Uncopyable() {} 6 private: 7 Uncopyable(const Uncopyable&); 8 Uncopyable& operator=(const Uncopyable&); 9 */ 10 //lazy man 11 class Singleton : private Uncopyable{ 12 private: 13 Singleton() {pthread_mutex_init(mutex);} 14 static Singleton* ptr; 15 static pthread_mutex_t mutex; 16 17 public: 18 Singleton* GetSingleton(){ 19 if(ptr==nullptr){ 20 mutex.lock() 21 if(ptr==nullptr){ 22 static Singleton single; 23 return &single; 24 } 25 mutex.unlock(); 26 } 27 return ptr; 28 } 29 }; 30 Singleton* Singleton::ptr=nullptr;
标签:effect main cal prot man delete lock protect gets
原文地址:https://www.cnblogs.com/zx-y/p/11369445.html