单例模式——创建型模式
什么是单例模式?
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象, 过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
单例模式的使用场景:
开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象。
单例模式的实现思路:
- 将默认构造函数设为私有, 防止其他对象使用单例类的
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);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;
}