单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制对资源(如配置对象、线程池、缓存等)的访问时特别有用。
一、单例模式的实现方式
懒汉模式(Lazy Initialization):
延迟初始化:类的第一个实例在第一次被使用时创建。
线程安全:通过双重检查锁定(Double-Checked Locking)来确保线程安全。
性能:由于延迟初始化,可以减少不必要的对象创建,从而提高性能。
class Singleton { public: static Singleton* getInstance() { if (_instance == nullptr) { std::lock_guard<mutex> lock(_mutex); if (_instance == nullptr) { _instance = new Singleton(); } } return _instance; } private: Singleton() {} // 私有构造函数,防止直接实例化 ~Singleton() {} // 私有析构函数,确保正确清理 private: static Singleton* _instance; // 静态实例 static std::mutex _mutex; // 互斥锁 };
饿汉模式(Eager Initialization):
立即初始化:类的第一个实例在程序启动时就创建。
线程安全:通常不需要额外的同步机制,因为实例在程序启动时就创建了。
性能:可能会因为提前创建实例而增加一些开销,但如果实例创建是轻量级的,这可能不是问题。
class Singleton { public: Singleton() {} // 私有构造函数,防止直接实例化 static Singleton& getInstance() { static Singleton instance(_instance); return instance; } private: Singleton() {} // 私有构造函数,防止直接实例化 static Singleton _instance; // 静态实例 };
在饿汉模式中,实例在第一次调用 getInstance
方法时创建,而在饿汉模式中,实例在类加载时就创建。选择哪种模式取决于具体需求和上下文。饿汉模式可以节省资源,但如果初始化顺序很重要,或者需要确保在多线程环境中安全地创建实例,饿汉模式可能更合适。