• 设计模式--单例模式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();

    }

  • 相关阅读:
    C#中的String.Length获取中文字符串长度出错
    PHP+Jquery+Ajax实现checkbox多选删除功能
    WIndows下AppAche服务中调试php页面出现警告:Call to undefined function mysql_connect()
    简洁的SQL一条语句更新从属账号
    算法导论数论一般离散对数问题
    Poj 2115
    算法导论数论计算x^2=1(mod n) 在区间[1,n1]的解
    算法导论数论RSA公钥加密系统
    算法导论数论中国余数定理
    Poj 2891 中国剩余定理 非互素
  • 原文地址:https://www.cnblogs.com/lang5230/p/5301276.html
Copyright © 2020-2023  润新知