设计模式-单例模式

设计模式-单例模式

前言

由于作者做的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() {
        // 示例方法
    }
};
相关推荐
张小姐的猫9 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
杨充12 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充12 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充12 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充12 小时前
2.面向对象的特性
设计模式
杨充12 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充12 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充12 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯15 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法