单例模式(附代码)

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了单例模式(附代码)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1.单例模式:一个类只有一个对象的场景

  单例模式分为:     1. 饿汉模式     2. 懒汉模式     3. 多线程模式   单例模式需要满足:     1.一个类只产生一个实例     2.提供一个对该实例全局访问的指针     3.客户端是单例类,但不影响以后有多个实例 判断饿汉和懒汉:   饿汉:运行到自己时,就将自己实例化一个对象,所以很饿。因为程序一运行,就生成实力对象,所以不存在线程安全的问题   懒汉:只有当第一次调用类中的函数GetInstance()时,才会实例化一个对象,就是说只有需要的时候才调用这个函数产生对象,所以很懒。并且存在线程安全问题,多个进程调用该函数,就会导致实例化多个对象。所以要加锁

2.饿汉模式:

class Singleton(){
  private: 
    Sinleton(){}; //私有化构造函数,使得外部无法直接实例化得到一个对象
    static Singleton* P_Hungry; //静态指针指向唯一对象
  public:
    static Singleton* GetInstance(){
      return P_Hungry;
  }
}
Singleton* Singleton::P_Hungry =new Singleton();
//static变量类外 实例化,调用构造函数,分配了对象的空间
//表现得很急,还没有调用类中的GetInstance(),已经将这个类的对象实例化出来,P_Hungry 指向该对象

3. 懒汉模式:

class Singleton(){
  private: 
    Sinleton(){}; //私有化构造函数,使得外部无法直接实例化得到一个对象
    static Singleton* P_Lazy;  
  public:
    static Singleton* GetInstance(){
      if(P_Lazy == NULL){
        P_Lazy = new Singleton();  //只有当调用这个GetInstance()函数时,才实例化一个对象,P_Lazy指向该对象
    }
      return P_Lazy;
  }
}
Singleton* Singleton::P_Lazy =NULL; 
//static变量类外 初始化,没有调用构造函数,只是给指针分配了空间,对象没有实例化

4.多线程单例模式(解决懒汉模式线程安全的问题)

需要加两个if(P_Lazy == NULL),避免进程堵塞

class Singleton(){
  private: 
    Sinleton(){}; //私有化构造函数,使得外部无法直接实例化得到一个对象
    static Singleton* P_Lazy; 
    static Lock lock(); 
  public:
    static Singleton* GetInstance(){
      if(P_Lazy == NULL){
          lock();
          if(P_Lazy == NULL){
             P_Lazy = new Singleton(); 
          }
          unlock();
      }
      return P_Lazy;
  }
}
Singleton* Singleton::P_Lazy =NULL; 

脚本宝典总结

以上是脚本宝典为你收集整理的单例模式(附代码)全部内容,希望文章能够帮你解决单例模式(附代码)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: