本文主要是介绍C++ | 单例设计模式(懒汉式单例模式源码|饿汉式单例模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
点击上方"蓝字"关注我们
01、概念
>>>单例设计模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于需要在整个应用程序中共享一个对象的场景,例如配置管理、日志记录、数据库连接池等。
02、场景
>>>应用场景
配置管理:应用程序的配置信息通常只需要一个实例来管理,避免多个配置实例导致数据不一致。
日志记录:日志记录器通常只需要一个实例,以便所有模块都能记录到同一个日志文件中。
数据库连接池:数据库连接池只需要一个实例来管理数据库连接,避免资源浪费。
线程池:线程池只需要一个实例来管理线程的创建和销毁。
03、多线程如何处理到单例模式 ?
>>>在多线程环境中,单例模式的实现需要考虑线程安全问题。如果不加以处理,可能会导致多个线程同时创建多个实例。常见的解决方案是使用双重检查锁定(Double-Checked Locking)或使用C++11引入的std::call_once来确保线程安全。
04、懒汉式单例模式(线程安全)
>>>std::unique_ptr 是 C++11 引入的一种智能指针,用于管理动态分配的对象,并确保在指针超出作用域时自动释放资源。std::unique_ptr 具有独占所有权,即同一时刻只能有一个 std::unique_ptr 指向某个对象。
std::unique_ptr 的特点
独占所有权:std::unique_ptr 不能被复制,只能通过移动语义(std::move)转移所有权。
自动释放资源:当 std::unique_ptr 超出作用域时,它会自动调用析构函数并释放所管理的对象。
轻量级:std::unique_ptr 的实现非常轻量级,通常只包含一个指针。
在单例模式中的应用
在单例模式中使用 std::unique_ptr 可以确保单例实例在程序结束时自动释放,避免内存泄漏。
// 懒汉式单例模式(线程安全)
#include <iostream>
#include <mutex>
#include <memory>
class Singleton {
public:
// 获取单例实例
static Singleton& getInstance() {
std::call_once(initFlag, initSingleton);
return *instance;
}
// 禁止拷贝和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
// 私有构造函数
Singleton() {
std::cout << "Singleton instance created." << std::endl;
}
// 初始化单例实例
static void initSingleton() {
instance.reset(new Singleton());
}
// 静态成员变量
static std::unique_ptr<Singleton> instance;
// 静态成员变量初始化标志
static std::once_flag initFlag;
};
// 静态成员变量初始化
std::unique_ptr<Singleton> Singleton::instance;
std::once_flag Singleton::initFlag;
int main() {
// 获取单例实例
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
// s1 和 s2 是同一个实例
if (&s1 == &s2) {
std::cout << "Same instance." << std::endl;
}
return 0;
}
05、饿汉式单例模式(线程安全)
>>>
// 饿汉式单例模式(线程安全)
#include <iostream>
class Singleton {
public:
// 获取单例实例
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
// 禁止拷贝和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
// 私有构造函数
Singleton() {
std::cout << "Singleton instance created." << std::endl;
}
};
int main() {
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
// s1 和 s2 是同一个实例
if (&s1 == &s2) {
std::cout << "Same instance." << std::endl;
}
return 0;
}
06、区别
>>>懒汉式和饿汉式是两种常见的实现方式,懒汉式在第一次使用时才创建实例,而饿汉式则在程序启动时就创建实例。
总结
>>>创建型模式(Creational Patterns)
| 模式名称 | 描述 |
| 单例模式(Singleton) | 确保一个类只有一个实例,并提供一个全局访问点。|
| 工厂方法模式(Factory Method) | 定义一个创建对象的接口,但由子类决定实例化哪个类。|
| 抽象工厂模式(Abstract Factory) | 提供一个接口,用于创建相关或依赖对象的家族,而不指定具体的类。|
| 建造者模式(Builder) | 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。|
| 原型模式(Prototype) | 通过复制现有对象来创建新对象,而不是通过实例化类。|
故我在
点击下方卡片 关注我
↓↓↓
这篇关于C++ | 单例设计模式(懒汉式单例模式源码|饿汉式单例模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!