作用 绕过常规实例的构造器,提供一种机制保证一个类只有一个实例。 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点 缺点 一般不要支持ICloneable结果,因为这可能会导致多个对象实例 一般不要支持序列化,这样可能会导致多个实例的创建 只考虑类对象创建的管理,没有考虑对象销毁的管理 实现方式 //No.1 隐藏默认构造函数,抛出静态方法,实例话静态字段 //不支持多线程 public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton Instance{ get{ if(instance==null){ instance=new Singleton(); } return instance; } } } //No.2 静态字段只有在姿态构造函数中初始化一次,所以只会new一次 //不支持多线程 public class Singleton { private static Singleton instance=new Singleton(); private Singleton(){} public static Singleton Instance{ get{ return instance; } } } //No.3 volatile+look组合 多线程单例 //volatile:防治编译后的指令序列与代码顺序不一致 public class Singleton { private static volatile Singleton instance=null; private static object lookHelper=new object(); private Singleton(){} public static Singleton Instance{ get{ if(instance==null){ look(lookHelper){ if(instance==null){ instance=new Singleton(); } } } return instance; } } } //No.4 readonly关键字 //内联初始化,即声明的时候直接初始化 //Instance在静态构造函数中初始化 //类似于No.2方法 //缺点:不支持参数化 public class Singleton { private static readonly Singleton Instance=new Singleton(); private Singleton(){} } Next Post → FEATURED TAGS 设计模式 DotNet 算法 软件工程 TCP/IP FRIENDS GitHub