设计模式——单例模式
一、概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二、UML示意图:
Singleton定义了一个单例类,为了控制类中实例唯一且不能被外界实例化,把构造函数定义为私有函数,只能通过GetInstance方法创建唯一实例,要访问单例类的实例可以通过GetInstance方法获取类中的唯一实例instance。
三、饿汉式单例类和懒汉式单例类
饿汉式:当类被加载的时候就创建唯一实例。缺点是需要提前占用系统资源。
懒汉式:当单例对象第一次被访问时才创建唯一实例。缺点是在多线程环境下要做双重锁定来防止当唯一实例尚未创建时多个线程同时访问导致同时创建唯一实例的安全问题。
四、优缺点
优点:
- 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
- 因为类控制了实例化过程,所以类可以灵活更改实例化过程。
- 因为只会创建一个实例,节省了系统资源。
- 避免对共享资源的多重占用。
- 提供了对唯一实例的受控访问。
缺点:
- 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
- 虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
- 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。