• 设计模式-单例模式(创建型)


    1 单例模式

    1.0 需求

    类的对象只能存在一个。

    1.1 实现

    使用类的静态对象成员保存唯一的单例对象,然后将构造函数设为private。

    通过一个静态函数返回保存的单例对象。

    依据静态数据成员创建的时机分为:程序加载时创建(直接new),首次需要的时候创建(get中先判断是否为null)

    在多线程中,延时创建会导致争用,因此采用两段判断的形式。

    class Singleton
    {
      private:
        Singleton() = default;
        static Singleton *_instance;
    
      public:
        static Singleton *instance();
        static bool freeInstance();
        Mutex lock;
    };
    
    //惰性模式,不访问不创建,在第一次访问的时候创建
    //对静态变量的初始化必需放在类的外部
    Singleton Singleton::*_instance = nullptr;
    Singleton Singleton::*instance()
    {
        // 两段判断的形式
        if (_instance = nullptr)
        {
            MutexLock lock(lock);
            if (_instance = nullptr)
            {
                _instance = new Singleton();
            }
        }
        return _instance;
    }
    
    //非惰性模式
    //在程序一运行就进行了初始化
    Singleton Singleton::*_instance = new Singleton();
    Singleton Singleton::*instance()
    {
        return _instance;
    }
    
    bool Singleton::freeInstance()
    {
        if (_instance != nullptr)
        {
            delete _instance;
            _instance = nullptr;
        }
    }
    

      

    单例模式的派生类也是单例模式

    原文

    // 每个派生体系都公用一个基类实例。
    template <class T>
    class Singleton
    {
      private:
        static T *m_Instance;
    
      protected:
        Singleton(){};
        Singleton(const Singleton &);
    
      public:
        static T *Get_Instance() 
        {
            if(m_Instance == nullptr)
            {
                m_Instance =new T; //这里生成的是T
            }
            return m_Instance;
        }
        static void Free_Instance();
    };
    
    // public 继承的原因在于,派生类需要使用 Get_Instance 和 Free_Instance;
    class test : public Singleton<test>
    { 
        // 声明为 友元原因在于需要调用 Singleton 中的 Get_Instance 需要 new T ,需要
        // 调用本类 的构造函数。
        friend class Singleton<test>;
      private:
        test() {}
    
      public:
        //do
    };
    

      

     

  • 相关阅读:
    DQL 组合连接多个字段
    twig的 function 学习
    twig的 tests 学习
    贴一个自定义的 symfony 的表单皮肤 应用bootstrap效果
    symfony2使用form指定的checkbox,设置其属性disabled
    twig 模板设计 快速入门手册 中文
    MyEclipse中J2ee项目的一些Java文件报错!
    JavaScript的三种代码书写格式
    VB的学习及使用总结
    CSS优先级的说明
  • 原文地址:https://www.cnblogs.com/perfy576/p/8551431.html
Copyright © 2020-2023  润新知