美文网首页
单例模式

单例模式

作者: 小跑001 | 来源:发表于2020-07-12 21:25 被阅读0次

有2个星期没过来了, 这2个星期忙着考试.
言归正传, 今天想写下单例模式, 有时候想写一个完善的单例模式还是需要考虑一些东西的.

1 先看下普通的单例模式:

class TestSingle {

 private:
     TestSingle();
     TestSingle(const TestSingle&);
     TestSingle &operator = (const TestSingle&);

 public:
    static TestSingle* GetInstance() {
            static TestSingle s;
            return &s;
     }
};

  • 其中private申明函数来避免通过其它方式构造或者拷贝此类的实例, 在这里只能通过公共函数GetInstance来获取类的实例, 从而确保只有一个实例.
  • 通过static来保证每次通过GetInstance只能获取同一份实例.

2 多线程单例

还有一种变种, 有时候希望在单例初始化里面调用一些初始化的功能就要考虑多线程安全的问题了. 还是直接看代码

#include <mutex>
#include <atomic>

class TestSingle {

 private:
     TestSingle();
     TestSingle(const TestSingle&);
     TestSingle &operator = (const TestSingle&);
     void Init();

 public:
     static TestSingle* GetInstance() {
         if (single_) {
             return single_;
         }

         std::lock_guard<std::mutex> lck (single_mtx_);
         if (single_) {  // 注意这里需要再次判断, 避免再次初始化
             return single_;
         }
         TestSingle* tmp = new(TestSingle); // 不要直接赋值给single_, 以防别的线程获取到没有初始化的指针
         tmp->Init();
         single_ = tmp;
         return single_;
     }

 private:
     static std::atomic<TestSingle*> single_; // static. 通过atomic达到内存屏障, 避免指令优化, 导致获取未初始化的变量. 
     static std::mutex single_mtx_; // static
};

3 单例模版

然而单例多了, 每次都这么写一遍就浪费时间了, 能不能抽象出来, 形成一个模版呢, 还是看代码吧.

template < typename T >
class Singleton {
  public:
    static T* GetInstance() {
      static T instance;
      return &instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator= (const Singleton) = delete;

  protected: // 注意这里的访问权限, 允许子类可以访问, 否则无法创建对象
    Singleton() { };
    virtual ~Singleton() {std::cout << "deconstructor Singleton" << std::endl; }
};

class Test: public Singleton<Test> {
    friend class Singleton<Test>; // 方便访问这里的私有构造函数以及析构函数.
 private:
    Test(){}
    ~Test(){std::cout << "deconstructor Test" << std::endl; }
};

int main() {
    Test* t = Test::GetInstance();
    return 0;
}


相关文章

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式

    单例模式1 单例模式2

  • java的单例模式

    饿汉单例模式 懒汉单例模式

网友评论

      本文标题:单例模式

      本文链接:https://www.haomeiwen.com/subject/tcencktx.html