单例模式——创建型模式
什么是单例模式?
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象, 过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
单例模式的使用场景:
开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象。
单例模式的实现思路:
- 将默认构造函数设为私有, 防止其他对象使用单例类的
new
运算符。 - 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。
单例模式的写法:
写法有十几种,这里介绍一下懒汉和饿汉 ↓
懒汉模式:
- "懒汉"是指对象在被需要时才会创建,就像懒惰的人一样,只有在需要时才会去做事情。因此,懒汉模式延迟了对象的创建时机,直到第一次使用时才会创建实例。
饿汉模式:
- "饿汉"是指对象在类加载时就已经被创建,就像饿着肚子的人一样,对事情都很急迫,因此在类加载阶段就立即创建实例。这样无论是否需要,对象都会被创建。
懒汉模式C++实现样例:
/*************************************************************************
> File Name: 6.Singleton.cpp
> Author:
> Mail:
> Created Time: Mon Mar 11 17:41:51 2024
************************************************************************/
#include <iostream>
#include <mutex>
using namespace std;
class Database {
private:
Database() {
// The logic of init Database.
}
static Database *instance;
static mutex mtx;
public:
static Database* getInstance();
void query();
};
Database* Database::instance = nullptr;
mutex Database::mtx;
Database* Database::getInstance() {
if (instance) return instance;
lock_guard<mutex> lock(mtx);
if (!instance) instance = new Database();
return instance;
}
void Database::query() {
cout << "query success !!! " << instance << endl;
return ;
}
void CodeClient() {
Database *p1 = Database::getInstance();
p1->query();
Database *p2 = Database::getInstance();
p2->query();
}
int main() {
CodeClient();
return 0;
}