概述
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
特点
根据上面所述,单例模式有如下特点:
- 单例类只能有一个实例;
- 单例类必须自己创建自己的唯一实例;
- 单例类必须给其它所有对象提供该类实例。
优点
- 实例控制:单例类阻止了其他对象实例化单例类副本,保证只有一个实例。
- 灵活性:控制了实例过程,也就可以灵活修改单例类内部实例化过程。
缺点
- 由于每次引用单例类实例都要判断是否存在实例,造成额外开销。当然,这个不是事,可以通过静态初始化的实例的方法解决;
- 如果没有详细的文档或者说明,开发人员可能实例化单例类;
- 对象的生存期:单例类不能解决单个对象的删除问题,当然在像C#、JAVA这样的具有内存管理的语言中是可以不考虑这个的。
适用范围
- 使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
举例说明
- 系统中只能有一个窗口管理器;
- 每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中;
代码示例
下面是一个双重锁机制的单例类,代码如下所示:
namespace Singleton { public class Singleton { //定义一个私有的静态全局变量来保存该类的唯一实例 private static Singleton singleton; //定义一个只读静态对象 //且这个对象是在程序运行时创建的 private static readonly object syncObject = new object(); /// <summary> /// 构造函数必须是私有的 /// 这样在外部便无法使用 new 来创建该类的实例 /// </summary> private Singleton() {} /// <summary> /// 定义一个全局访问点 /// 设置为静态方法 /// 则在类的外部便无需实例化就可以调用该方法 /// </summary> /// <returns></returns> public static Singleton GetInstance() { //这里可以保证只实例化一次 //即在第一次调用时实例化 //以后调用便不会再实例化 //第一重 singleton == null if (singleton == null) { lock (syncObject) { //第二重 singleton == null if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } }
设计模式(1)--单例模式(Singleton Pattern),布布扣,bubuko.com
时间: 2024-09-29 06:09:48