单例模式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的初始化,正在纠结中,找到方法了会有补充。