1.概念:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
2.单例模式设计方式:
① 将构造、拷贝构造屏蔽;
② 在类中提供一个唯一接口、生成唯一对象;
简单单例模式代码:
class SingleTon
{
public:
static SingleTon& getInstance()//static摆脱对对象的依赖;提供接口生成唯一对象
{
return SingTen;
}
private:
SingleTon(){};//屏蔽构造
SingleTon(const SingleTon&);//屏蔽拷贝构造
static SingleTon single;//保存生成唯一对象的地址
};
SingleTon SingleTon::single;//静态成员变量,需要在类外初始化
注:此代码在多线程环境下不安全
为提高效率,所以引入双重锁机制,代码如下:
class SingleTon
{
public:
static SingleTon* getIntance()
{
if (psing == NULL)
{
//lock()加锁
if (psing == NULL)
{
psing = new SingleTon();
}
//unlock()解锁
}
return psing;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon* psing;
};
SingleTon* SingleTon::psing = NULL;
3.单例模式的使拥实例
①打印机:只要有打印任务在进行,就必须等待当前打印任务结束在打印,一个PC端只能在同一时刻连接一台打印机;
②系统的日志文件:只需要一个日志文件记录系统的状态信息
③网站的计数器,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题
4.应用场景特点总结
① 需要生成唯一序列的环境
②需要频繁实例化然后销毁的对象。
③创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
④方便资源相互通信的环境