设计模式-单例模式

设计模式-单例模式

前言

由于作者做的C++开发比较多所以本文实例都以C++语言方式给出。

单例模式

单例顾名思义只有一个实例,如果想要设计一个只有一个实例对象的类,就需要使用到该模式。

设计思路

  1. 只能存在一个实例
  2. 只能自己创建这个实例
  3. 给出一个提供实例的静态方法

懒汉式

懒汉式可以理解为非常懒,只有在有调用获取单例对象的时候才去创建对象。

因为懒汉式是在使用的时候才去进行实例化这就可能在多线程的时候,由于多个线程之间信息不同步导致创造多个实例的风险,可以使用双检锁实现。第一次instance判空的意义是大多数instance都不为空,可以提高性能,不然每次都加锁后判断性能会差一些。

复制代码
#include <mutex>

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;
    
    // 私有构造函数防止外部实例化
    Singleton() {}
    
    // 防止拷贝和赋值
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
    
    void someMethod() {
        // 示例方法
    }
};

饿汉式

饿汉式可以理解为非常饥饿程序开始运行不管有没有人获取单例都直接创建对象。

下面是我常用的饿汉式定义方法,采用静态变量。静态变量存储在静态存储区只有在进程运行结束后才会释放。我们就可以采用静态变量的特点去创建一个实例,然后每次都返回这个实例,这样就保证了这个实例对象在整个进程中只存在一份。

复制代码
class Singleton {
private:
    static Singleton instance;  // 类加载时就初始化
    
    Singleton() {}  // 私有构造函数
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton& getInstance() {
        return instance;
    }
    
    void someMethod() {
        // 示例方法
    }
};
相关推荐
博语小屋12 小时前
简单线程池实现(单例模式)
linux·开发语言·c++·单例模式
电子科技圈12 小时前
SiFive车规级RISC-V IP获IAR最新版嵌入式开发工具全面支持,加速汽车电子创新
嵌入式硬件·tcp/ip·设计模式·汽车·代码规范·risc-v·代码复审
利刃大大12 小时前
【JavaSE】十五、线程同步wait | notify && 单例模式 && 阻塞队列 && 线程池 && 定时器
java·单例模式·线程池·定时器·阻塞队列
七月丶13 小时前
Cloudflare 🌏 中国大陆网络访问优化 - 0元成本
人工智能·react.js·设计模式
筏.k14 小时前
C++ 设计模式系列:单例模式
c++·单例模式·设计模式
__万波__14 小时前
二十三种设计模式(十二)--代理模式
java·设计模式·代理模式
郝学胜-神的一滴15 小时前
Linux线程编程:从原理到实践
linux·服务器·开发语言·c++·程序人生·设计模式·软件工程
我爱学习_zwj15 小时前
前端设计模式:轻量级实战指南
设计模式·前端框架·状态模式
还是大剑师兰特15 小时前
前端设计模式:详解、应用场景与核心对比
前端·设计模式·大剑师
平凡之路无尽路2 天前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm