1.什么是单例设计模式
单例模式是⼀种创建型设计模式, 它的核⼼思想是保证⼀个类只有⼀个实例,并提供⼀个全局访问点来访问这个实例。
- 只有⼀个实例的意思是,在整个应⽤程序中,只存在该类的⼀个实例对象,⽽不是创建多个相同类型的对象。
- 全局访问点的意思是,为了让其他类能够获取到这个唯⼀实例,该类提供了⼀个全局访问点(通常是⼀个静态⽅法),通过这个⽅法就能获得实例。
2.为什么要使⽤单例设计模式呢
简易来说,单例设计模式有以下⼏个优点让我们考虑使⽤它:
- 全局控制:保证只有⼀个实例,这样就可以严格的控制客户怎样访问它以及何时访问它,简单的说就是对唯⼀实例的受控访问(引⽤⾃《⼤话设计模式》第21章)
- 节省资源:也正是因为只有⼀个实例存在,就避免多次创建了相同的对象,从⽽节省了系统资源,⽽且多个模块还可以通过单例实例共享数据。
- 懒加载:单例模式可以实现懒加载,只有在需要时才进⾏实例化,这⽆疑会提⾼程序的性能。
3.单例设计模式的基本要求
想要实现⼀个单例设计模式,必须遵循以下规则:
- 私有的构造函数:防⽌外部代码直接创建类的实例私有的静态实例变量:保存该类的唯⼀实例
- 公有的静态⽅法:通过公有的静态⽅法来获取类的实例
4.单例设计模式的实现
单例模式的实现⽅式有多种,包括懒汉式、饿汉式等。
- 饿汉式指的是在类加载时就已经完成了实例的创建,不管后⾯创建的实例有没有使⽤,先创建再说,所以叫做“饿汉”。
- ⽽懒汉式指的是只有在请求实例时才会创建,如果在⾸次请求时还没有创建,就创建⼀个新的实例,如果已经创建,就返回已有的实例,意思就是需要使⽤了再创建,所以称为“懒汉”。
在多线程环境下,由于饿汉式在程序启动阶段就完成了实例的初始化,因此不存在多个线程同时尝试初始化实例的问题,但是懒汉式中多个线程同时访问 getInstance() ⽅法,并且在同⼀时刻检测到实例没有被创建,就可能会同时创建实例,从⽽导致多个实例被创建,这种情况下我们可以采⽤⼀些同步机制,例如使⽤互斥锁来确保在任何时刻只有⼀个线程能够执⾏实例的创建。
饿汉模式代码示例:
#include
using namespace std; class TaskQueue { public: static TaskQueue* getInstance() { return m_taskQ; } void print() { cout << "单利对象成员函数" << endl; } private: TaskQueue() = default;//C++11新特性 TaskQueue(const TaskQueue& t) = default; TaskQueue& operator = (const TaskQueue& t) = default; static TaskQueue* m_taskQ; }; TaskQueue* TaskQueue::m_taskQ = new TaskQueue;//初始化 int main() { TaskQueue* taskQ = TaskQueue::getInstance(); taskQ->print(); return 0; } 懒汉模式代码示例:
#include
#include using namespace std; class TaskQueue { public: static TaskQueue* getInstance() { m_mutex.lock(); if (m_taskQ == nullptr) { m_taskQ = new TaskQueue; } m_mutex.unlock(); return m_taskQ; } void print() { cout << "单利对象成员函数" << endl; } private: TaskQueue() = default;//C++11新特性 TaskQueue(const TaskQueue& t) = default; TaskQueue& operator = (const TaskQueue& t) = default; static TaskQueue* m_taskQ; static mutex m_mutex; }; TaskQueue* TaskQueue::m_taskQ = nullptr;//创建实例 int main() { TaskQueue* taskQ = TaskQueue::getInstance(); taskQ->print(); return 0; }
还没有评论,来说两句吧...