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

Posted 狼行博客园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--单例模式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的初始化,正在纠结中,找到方法了会有补充。

 

以上是关于设计模式--单例模式C++实现的主要内容,如果未能解决你的问题,请参考以下文章

C++ 单例模式总结与剖析

单例模式之C++实现

C++ 单例模式(singleton)

C++ 单例模式(singleton)

单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)

单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)