文章目录
单例模式
单例模式是一种创建型设计模式;
确保一个类在应用程序的生命周期内仅有一个实例并提供一个全局访问点来访问该实例;
单例模式主要目的是为了控制某些类的实例化以避免产生多个实例,从而节省资源和避免数据不一致问题;
单例模式的核心要点为如下:
-
唯一性
单例模式确保一个类只有一个实例,意味着该类的所有对象共享相同的状态和行为;
-
全局访问点
单例模式提供了一个静态方法(
getInstance()
),使得客户端可通过这个方法访问唯一的实例而不需要创建对象; -
加载方式
单例模式可通过需求来自定义需要的加载方式,常见的加载方式为饿汉加载懒汉加载;
-
饿汉加载
饿汉加载指的是单例模式在进程创建时就对单例的资源进行初始化,从而间接提高运行的速度;
因为进程启动时单例就已经被初始化意味着不需要再花时间对该单例进行初始化操作;
相同的由于初始化的时机是在进程启动时,所以饿汉加载方式的启动速度要较慢;
饿汉加载是线程安全的,但饿汉模式加载处的实例若是没有被使用则是一种空间的浪费的行为;
尽管饿汉加载是线程安全的,也只是代表在加载过程中是安全的,若是实例中存在可能出现资源竞争的临界资源时同样必须为该单例考虑同步互斥问题;
-
懒汉加载
懒汉加载是单例的一种加载模式,懒汉加载模式旨在需要时对实例进初始化加载,从而提高进程的加载速度;
由于懒汉加载模式是在需要时对实例进行加载,这意味着不需要花费时间在进程启动时对实例进行资源的加载;
与饿汉模式不同,懒汉加载不是线程安全的,懒汉加载模式涉及到当需要该实例时多个线程同时调用加载函数对实例进行初始化加载,故在设计懒汉加载时需要考虑多线程并发情况下线程的同步与互斥问题;
与饿汉模式不同的是懒汉模式不存在"一定要加载,不一定使用"的问题所引发的资源浪费的可能;
-
单例模式的实现步骤一般为:
-
私有化构造函数
通过私有化构造函数防止类外代码随意对实例进行控制从而可能产生多个实例;
-
静态私有成员变量
在类中声名一个静态的私有成员变量,用于存储该类的唯一实例,这个成员变量可以是一个对象也可以是一个指针变量,取决于加载方式;
-
静态公有方法
在单例模式中会提供一个静态共有方法(通常命名为
getInstance()
)来获取该类的唯一实例;
饿汉加载的单例模式实现
// 单例类的定义
class SingletonInstance {
public:
// 静态方法,用于获取唯一实例
static SingletonInstance& getInstance() {
return instance_; // 返回静态实例
}
// 打印示例方法
void Print() {
std::cout << "This is a Singleton model" << std::endl;
}
private:
// 私有构造函数,防止外部实例化
SingletonInstance() {
std::cout << "SingletonInstance()" << std::endl;
}
// 私有析构函数,防止外部删除实例
~SingletonInstance() {
std::cout << "~SingletonInstance()" << std::endl