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

}

posted @ 2016-03-21 11:55  狼行博客园  阅读(3374)  评论(0编辑  收藏  举报