单例模式

88 阅读2分钟

1.什么是单例模式?

   单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序中,该类只存在一个实例对象。

实现步骤:

构造函数私有化。
提供一个全局的静态方法,访问唯一的对象。
类中定义一个静态指针,指向唯一对象。

应用场景

在应用系统开发中,我们常常有以下需求:
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁的对象.
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象
4.方便资源相互通信的环境

实际案例: 多线程中网络资源初始化。 回收站机制, 任务管理器, 应用程序日志管理。

不同设计:懒汉式和饿汉式

懒汉式:直接在静态方法中构造一个对象,对外不构造对象。饿汗式则相反

懒汉式:线程安全

class SingleTon{
public:
  static SingleTon* m_singleTon;
  static SingleTon* GetInstance(){
      if (m_singleTon == NULL){
        m_singleTon = new SingleTon;
      }
      return m_singleTon;
  }
private:
  singleTon(){
    cout << "构造对象.....<< endl;
    m_singleTon=NULL;
  }
}
SingleTon* SingleTon::m_singleTon = NULL;

image.png

饿汗式:多线程中资源竞争,锁

class SingleTon{ 
public: 
    static SingleTon* m_singleTon; 
    static SingleTon* GetInstance(){ 
    return m_singleTon;
    } 
private: 
    singleTon(){
    cout << "构造对象.....<< endl; m_singleTon=NULL; 
    } 
} 
SingleTon* SingleTon::m_singleTon = new SingleTon;

单例模式优缺点

优点:

在内存中只有一个对象,节省内存空间;
避免频繁的创建销毁对象,可以提高性能;
避免对共享资源的多重占用,简化访问
为整个系统提供一个全局访问点。

缺点

不适用于变化频繁的对象;
如果实例化的对象长时间用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

模板:

image.png