单例模式
1.懒汉模式
class NormalCase { public string Name { get; set; } //第一步:构造函数私有化: 外界不能用new 进行实例 private NormalCase() { } //第二步:自行创建一个空实例 static代表只能创建一个实例 private static NormalCase normalCase=null;//赖汉模式 //第三步:提供外界可访问实例的方法 public static NormalCase getInstance() { //存在安全:多线程并发:会产生多个实例 if (normalCase==null) { normalCase = new NormalCase(); } return normalCase; } public void ShowMsg() { Console.WriteLine(Name); } }
2.普通类改为单利模式
class NormalCase { public string Name { get; set; } //第一步:构造函数私有化: 外界不能用new 进行实例 private NormalCase() { } //第二步:自行创建一个实例 static代表只能创建一个实例 private static NormalCase normalCase = new NormalCase();//饿汉模式 //第三步:提供外界可访问实例的方法 public static NormalCase getInstance() { return normalCase; } public void ShowMsg() { Console.WriteLine(Name); } }
3.内部静态类实现双重验证
class NormalCase { public string Name { get; set; } //第一步:构造函数私有化: 外界不能用new 进行实例 private NormalCase() { } //第二步:内部静态类 private static class NormalCaseHelper { public static NormalCase normalCase = new NormalCase(); } //第三步:提供外界可访问实例的方法 public static NormalCase getInstance() { return NormalCaseHelper.normalCase; } public void ShowMsg() { Console.WriteLine(Name); } }
4.双重验证
class NormalCase { //定义一个锁资源 private static readonly Object obj = new object(); public string Name { get; set; } //第一步:构造函数私有化: 外界不能用new 进行实例 private NormalCase() { } //第二步:自行创建一个空实例 static代表只能创建一个实例 private static NormalCase normalCase=null;//赖汉模式 //第三步:提供外界可访问实例的方法 public static NormalCase getInstance() { //一重验证 if (normalCase==null) { lock(obj) { //二重验证 if (normalCase == null) { normalCase = new NormalCase(); } } } return normalCase; } public void ShowMsg() { Console.WriteLine(Name); } }
5.控制台输出
class Program { static void Main(string[] args) { NormalCase nc = NormalCase.getInstance(); nc.Name = "Jack"; nc.ShowMsg(); NormalCase nc1 = NormalCase.getInstance(); nc1.ShowMsg(); Console.Read(); } }