Singleton模式
一、简介:
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。[GOF]
优点:1.一个类仅有一个实例,并且客户可以从一个众所周知的访问点访问它。
2.该类可以通过子类化扩展,并且不需要改变用户已有代码。
3.惰性初始化,只有在客户实际使用时才创建该类的唯一实例。
4.是对全局变量的一种改进,避免全局变量污染命名空间。
5.不会造成潜在的初始化和析构问题。(不同编译单元的全局变量和静态变量初始化顺序不定)
二、实现方式
GOF方式:
缺点:1.调用多次会返回多个指针,为防止单个用户调用delete删除对象,需要添加引用计数。
2.没有定义删除的时间,析构函数不会被调用,需要使用智能指针或 atexit 函数。
3.静态函数不支持虚继承。
4.多线程中可能导致多次创建问题(if 之后)。
使用智能指针改进:
Scott Meyers方式:
缺点:静态函数不支持虚继承。
三、子类
由于静态函数不支持虚继承,我们不能在子类中重新定义Intance的实现,导致每增加一个子类,我们都要修改基类的Instance函数的实现,并且需要一个参数用于决定实例化哪个子类。
Singleton的继承类还是Singleton模式的吗?如果是的话,构造函数应该是保护的,怎么能够被基类的Instance创建呢?如果不是Singleton模式,继承就没用了吧!
四、参考