码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式(饿汉式 懒汉式)

时间:2019-08-17 17:38:39      阅读:138      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!