zoukankan      html  css  js  c++  java
  • 设计模式--单例模式C++实现

    单例模式C++实现

     

    1描述:

    单例模式,又称单件模式。

    定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    2具体类图描述:

    2.1 StartUML内部生成模式类图

    该类图由StartUML逆向生成C++代码

    class Singleton {
    public:
        static Singleton* Instance();

    protected:

        Singleton();

    private:
        static Singleton *instance;
    };

    Singleton* Singleton::Instance()

    {

      if(instance==NULL)

        instance = new Singleton();

      return instance;

    }

    3.详解:

    根据单例模式的定义,那么实现这个需求,我们最简单的方法是

    ①定义一个全局静态对象,给系统使用。

    ②单例模式实现需求。

    注:这两个方都是可以满足需求的,但是呢,想想6大原则:依赖倒置,接口隔离。我们的设计应当是依赖接口,而非对象,那么久pass 刁①吧。

    4单例模式的优缺点:

    优点:一个实例,减少内存开销;减少系统开销;避免对一个资源的多重占用;设置全局访问点,优化和贡献资源。

    缺点:没有借口,扩展性差;不利于测试;与单一职责原则有冲突,单例模式把“要单例”和业务逻辑融合在一个类中。

    5使用场景:

    要求生成唯一序列号的环境;

    共享数据或者共享访问点;

    创建一个对象需要消耗的资源过多,如访问IO和数据库等资源;

    需要定义大量的静态常量和静态方法(工具类)

    6线程安全问题

    eg.当两个线程运行至if(instance==NULL)时,可能产生线程安全问题

    改进解决

    class Singleton {
    public:
        static Singleton* Instance();

    protected:

        Singleton();

    private:
        static Singleton *instance;
    };

    //对单例直接进行初始化,而不再方法Instance中进行判断。

    Singleton* Singleton::instance = new Singleton;

    Singleton* Singleton::Instance()

    {

      return instance;

    }

     7单例模式的扩展--多例模式。

    class Singleton {
    public:
        static Singleton* Instance();

    protected:

        Singleton();

    private:

      static enum{Max = 100};

      static int CurNum = 0;

        static list<Singleton *>instance_list;

    };

    Singleton* Singleton::Instance()

    {

      Random random = new Random();

      int count  = random.nextInt(Max);  //获取随机数

      return instance_list.get(count); //随机去除一个实例来用

    }

    8问题

    关于多例模式中的list的初始化:

    方案:

    class Singleton
    {
    public:
    static Singleton* GetInstance()
    {
    if (_singletonList.size() == 0)
    {
    //此处设置函数进行定制list也可
    _singletonList.push_back(new Singleton());
    _singletonList.push_back(new Singleton());
    _singletonList.push_back(new Singleton());
    }
    else
    {
    //对于多例模式,选择例子,返回
    Singleton* tmp = _singletonList.back();
    _singletonList.pop_back();
    return tmp;

    }

    }
    protected:
    Singleton()
    {}
    private:
    static list<Singleton*> _singletonList;
    };
    list<Singleton*> Singleton::_singletonList(NULL);

    void main()
    {
    Singleton* a = Singleton::GetInstance();
    Singleton* b = Singleton::GetInstance();

    }

  • 相关阅读:
    dda的fpga实现(转载)
    第四篇:数据预处理(一)
    第三篇:数据可视化
    第二篇:数据可视化
    第一篇:查阅数据
    RocketMQ集群部署记录
    使用k8s cronjob ,清除应用生成的日志文件
    使用HostAliases 添加pod 的/etc/hosts
    docker in docker 出现 libltdl.so.7 问题
    容器中JVM获取真实的CPU核数
  • 原文地址:https://www.cnblogs.com/lang5230/p/5301276.html
Copyright © 2011-2022 走看看