C++设计模式-单例模式

C++设计模式-单例模式


一、概念

单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例:

  • 保证一个类仅有一个实例
  • 提供一个访问它的全局访问点
  • 该实例被所有程序模块所共享

二、应用场景

单例模式的主要作用是确保一个类只有一个实例存在。单例模式可以用在建立目录、数据库连接等需要单线程操作的场合,用于实现对系统资源的控制。

三、定义方式

  • 私有化构造函数,以防止外界创建单例类的对象
  • 不需用拷贝和赋值,在单例模式中,始终只有一个对象
  • 提供一个自身的静态私有成员变量,以指向类的实例
  • 使用一个公有的静态方法获取该实例

四、实现方式

  • 解法一:基础懒汉式单例——单线程安全,多线程不安全
  • 解法二:加锁懒汉式单例——效率低
  • 解法三:对解法二的一个优化
  • 解法四:饿汉式单例——线程安全
  • 解法五:利用C++11的magic static特性实现的Meyers Singleton,安全,推荐

4.1 基础懒汉式单例

示例:

#include <iostream>

/**
 * @brief 基本懒汉式单例(非线程安全)
 * 由于要求只生成一个实例,因此必须把构造函数设为私有函数,以禁止他人创建实例
 * 可以定义一个静态的实例,在需要的时候创建该实例
 * 缺点:多线程情况下,不同线程可能创建出不同的Singleton实例
 */
class Singleton {
   
 public:
  static Singleton* getInstance() {
   
    if (instance_ == nullptr) {
   
      instance_ = new Singleton();
    }
    return instance_;
  }

  static void destroyInstance() {
   
    if (instance_ != nullptr) {
   
      delete instance_;
      instance_ = nullptr;
    }
  }

  void todo() {
    std::cout << "Singleton do ..." << std::endl; }

 private:
  Singleton() = default;                            // 默认构造
  ~Singleton() = default;                           // 默认析构
  Singleton(const Singleton&) = delete;             // 删除拷贝构造
  Singleton& operator=(const Singleton&) = delete;  // 删除拷贝赋值
  Singleton(Singleton&&) = delete;                  // 删除移动构造
  Singleton& operator=(Singleton&&) = delete;       // 删除移动赋值

 private:
  static Singleton* instance_;
};

// 初始化
Singleton* Singleton::instance_ = nullptr;

// test
int main() {
   
  Singleton::getInstance()->todo(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值