网站的设计要素,常用素材网站,兼职网站开发一个月,wordpress保存html创建型模式---单件模式(Singleton Pattern)动机#xff08;Motivation): 在软件系统中#xff0c;经常有这样一些特殊的类#xff0c;必须保证它们在系统中只存在一个实例#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器#xff0c;…创建型模式---单件模式(Singleton Pattern)动机Motivation): 在软件系统中经常有这样一些特殊的类必须保证它们在系统中只存在一个实例才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器提供一种机制来保证一个类只创建一个实例 这应该是类设计者的责任而不是类使用者的责任。结构图 意图 保证一个类仅有一个实例并提供一个访问它的全局访问点。 ------设计模式GOF 生活的例子 适用性 1当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2当这个唯一实例应该是通过子类化可扩展的并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现 1单线程Singleton实现 class SingleThread_Singleton { private static SingleThread_Singleton instance null; private SingleThread_Singleton(){} public static SingleThread_Singleton Instance { get { if (instance null) { instance new SingleThread_Singleton(); } return instance; } } } 以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。 如两个线程同时运行到 if (instance null)判断是否被实例化一个线程判断为True后在进行创建 instance new SingleThread_Singleton();之前另一个线程也判断(instance null)结果也为True. 这样就就违背了Singleton模式的原则保证一个类仅有一个实例。 怎样在多线程情况下实现Singleton2多线程Singleton实现 1 class MultiThread_Singleton 2 { 3 private static volatile MultiThread_Singleton instance null; 4 private static object lockHelper new object(); 5 private MultiThread_Singleton() { } 6 public static MultiThread_Singleton Instance 7 { 8 get 9 { 10 if (instance null) 11 { 12 lock (lockHelper) 13 { 14 if (instance null) 15 { 16 instance new MultiThread_Singleton(); 17 } 18 } 19 } 20 return instance; 21 } 22 } 23
此程序对多线程是安全的使用了一个辅助对象lockHelper保证只有一个线程创建实例如果instance为空保证只有一个线程instance new MultiThread_Singleton();创建唯一的一个实例。Double Check) 请注意一个关键字volatile如果去掉这个关键字还是有可能发生线程不是安全的。 volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态Singleton实现 3 class Static_Singleton 4 { 5 public static readonly Static_Singleton instance new Static_Singleton(); 6 private Static_Singleton() { } 7 } 以上代码展开等同于
1 class Static_Singleton 2 { 3 public static readonly Static_Singleton instance; 4 static Static_Singleton() 5 { 6 instance new Static_Singleton(); 7 } 8 private Static_Singleton() { } 9 }
由此可以看出完全符合Singleton的原则。 优点 简洁易懂 缺点 不可以实现带参数实例的创建。 注以上代码及信息借鉴于李建忠老师的MSDN和TerryLee的文章。