zoukankan      html  css  js  c++  java
  • C++模式学习------单例模式

    单例(Singleton)模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。例如一些类是属于工具,配置,日志性质的,程序很多的地方会用到,若每次都去new会增加了开销,也不好管理。这时候我们只需要一个实例对象就可以。这里是可以采用全局或者静态变量的方式,不过全局量没有封装,可能会有误用影响其他地方的情况。

    Lazy Singleton 

     1 class Singleton  
     2 {  
     3      public:  
     4         static Singleton& Instance() 
     5                   //使用的时候初始化单例
     6         {  
     7             if(instance == NULL)                       
     8                 instance = new Singleton;  
     9              return *instance;                          
    10         }  
    11   
    12      private: //为实现单例,需要将构造,复制构造都设为私有
    13          Singleton();                                  
    14          ~Singleton();  
    15          Singleton(const Singleton&);  
    16          Singleton& operator=(const Singleton&);  
    17    
    18          static Singleton* instance;  
    19 };  

    【这种模式不是线程安全的。多线程运行的时候,构造会出现问题。在这种情况下,需要加上互斥锁,来实现线程安全】

     1 class Singleton  
     2 {  
     3     public:  
     4         static Singleton& Instance() 
     5         {  
     6             if(instance== NULL)  //若未初始化则上锁初始化
     7             {     
     8                 Lock();//上锁  
     9                 if(instance== NULL)   
    10                     instance= new Singleton;  
    11                 Unlock();//解锁  
    12             }  
    13             return *instance;   
    14         }     
    15   
    16     private:  //为实现单例需要将构造函数,复制构造函数设为私有
    17         Singleton();   
    18         ~Singleton();  
    19         Singleton(const Singleton&);  
    20         Singleton& operator=(const Singleton&);  
    21   
    22         static Singleton* instance;  
    23 };  

    Eager Singleton

     1 class Singleton  
     2 {  
     3     public:  
     4         static Singleton& Instance() 
     5                   //用的时候返回单例
     6         {  
     7             return instance;  
     8         }  
     9   
    10     private:  //为实现单例,需要将构造,复制构造都设为私有
    11         Singleton(); 
    12         ~Singleton();  
    13         Singleton(const Singleton&);  
    14         Singleton& operator=(const Singleton&);  
    15   
    16         static Singleton instance;  //构造的时候初始化
    17 };  

    【初始化的时候构造完成,因此是线程安全的】

    Meyers Singleton

     1 class Singleton  
     2 {  
     3     public:  
     4         static Singleton& Instance()  
     5                            //第一次使用的时候构造
     6         {  
     7             static Singleton instance;  
     8             return instance;  
     9         }  
    10   
    11     private:  
    12         Singleton();  //  为实现单例,需要将构造复制构造设为私有
    13         ~Singleton();  
    14         Singleton(const Singleton&);  
    15         Singleton& operator=(const Singleton&);       
    16 };  

    【在c++11之后这种模式是线程安全的】

  • 相关阅读:
    四、分配swap分区
    三、fdisk分区
    二、文件系统常用命令
    一、回顾分区和文件系统
    三、文件系统属性chattr权限&系统命令sudo权限
    2、开发环境搭建
    1、基本概念
    SSH服务
    CentOS 7安装启动vsftpd服务
    01.HTML 5与HTML4的区别
  • 原文地址:https://www.cnblogs.com/tyche116/p/8666224.html
Copyright © 2011-2022 走看看