程序设计模式——单例模式

单例模式

饿汉模式

由于实例化是在初始化阶段执行的,所以没有线程安全的问题,但是潜在问题在于no-local static对象(函数外的static对象)在不同编译单元(可理解为cpp文件和其包含的头文件)中的初始化顺序是未定义的。如果在初始化完成之前调用 Instance()方法会返回一个未定义的实例。例如有两个单例 SingletonA 和 SingletonB ,都采用了 Eager Initialization ,那么如果 SingletonA 的初始化需要 SingletonB ,而这两个单例又在不同的编译单元,初始化顺序是不定的,如果 SingletonA 在 SingletonB 之前初始化,就会出错。

懒汉模式

这种方法的好处在于直到 Instance() 被访问,才会生成实例,这种特性被称为延迟初始化(Lazy Initialization),这在一些初始化时消耗较大的情况有很大优势。

Lazy Singleton不是线程安全的,比如现在有线程A和线程B,都通过了 ps == NULL 的判断,那么线程A和B都会创建新实例。单例模式保证生成唯一实例的规则被打破了。

你可能感兴趣的:(程序设计模式)