单例模式
单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例;
这在需要严格控制如何及合适访问某个唯一资源型下有一定作用;
单利模式的主要特点为如下:
-
私有构造函数
单例模式通常要将构造私有化,以保证无法直接通过该类实例化出对应的对象;
只能通过该类提供对应的接口来实例化整个对象,确保只有一个实例;
-
私有静态实例
私有静态实例保证实例只能在类内部进行访问,外部代码无法直接操作这个实例;
可防止外部代码以外或恶意修改改实例;
由于静态实例是私有的,可保证无论创建多少类的对象,静态成员始终只有一份;
在单例模式中以该特性确保整个程序中只有一个这样的实例;
-
公有静态函数
公有静态函数提供全局访问点来获取唯一的实例;
确保只允许外部代码通过该静态函数来访问类中唯一的实例;
一般情况下如果该实例还未存在时该方法将会创建一个新的实例,如果已存在则直接返回现有实例;
单例模式的优点:
- 保证一个类只有一个实例从而减少内存开销
- 避免对资源的多重占用
- 提供了对唯一实例的全局访问点
懒汉模式与饿汉模式
懒汉模式与饿汉模式属于单利模式加载方式的其中一种;
-
懒汉加载模式
懒汉模式指的是在进程启动时不立马加载实例,而是等到需要用到实例的时候再对实例进行加载;
该加载方式由于单例在进程启动时未被加载从而能够有效提升进程整体的加载速度;
但如果多个执行流同时在需要的时候加载实例时可能涉及到临界资源竞争问题,即懒汉模式不是线程安全的,故在以懒汉模式进行设计时应该要确保线程安全,如各个线程应通过互斥锁保持其互斥关系以避免临界资源竞争的问题;
class SingletonPattern { public: // 获取单例实例的静态方法 static SingletonPattern* getSP() { // 如果实例不存在,则创建一个新实例 if (!sp_) sp_ = new SingletonPattern(); // 返回单例实例 return sp_; } private: // 私有构造函数,防止外部直接创建实例 SingletonPattern() { // 无限循环,持续输出信息并暂停1秒 while (1) { cout << "SingletonPattern is running..." << endl; sleep(1); } } private: // 静态成员变量,用于存储单例实例 static SingletonPattern* sp_; }; // 静态成员变量初始化为nullptr SingletonPattern* SingletonPattern::sp_ = nullptr; int main() { // 主程序开始前暂停3秒 sleep(3); // 获取单例实例 SingletonPattern* sp =