单例模式的C#实现
2017-09-01 20:38
148 查看
借鉴各路大神的博客,也就不做链接了
class SingletonPattern { public sealed class Singleton1 { private static readonly Singleton1 instance = new Singleton1(); static Singleton1() { } private Singleton1() { } public static Singleton1 Instance { get { return instance; } } //测试方法 public void Hello() { Console.WriteLine("Hello1"); } } public sealed class Singleton2 { private static readonly Singleton2 instance = null; static Singleton2() { instance = new Singleton2();//静态初始化,不同于Singleton1 } private Singleton2() { } public static Singleton2 Instance { get { return instance; } } //测试方法 public void Hello() { Console.WriteLine("Hello2"); } } public sealed class Singleton3 { private static readonly Lazy<Singleton3> lazy = new Lazy<Singleton3>(() => new Singleton3()); public static Singleton3 Instance { get { return lazy.Value; } } private Singleton3() { } //测试方法 public void Hello() { Console.WriteLine("Hello3"); } } /// <summary> /// 最简单的单例,但线程不安全,对于单线程已然满足 /// </summary> public sealed class Singleton4 { private static Singleton4 instance = null; private Singleton4() { } public static Singleton4 Instance { get { if (instance == null) { instance = new Singleton4(); } return instance; } } //测试方法 public void Hello() { Console.WriteLine("Hello4"); } } /// <summary> /// 一重加锁,增加开销,保证线程安全 /// </summary> public sealed class Singleton5 { private static Singleton5 instance = null; private static readonly object padlock = new object(); private Singleton5() { } public static Singleton5 Instance { get { lock (padlock) { if (instance == null) { instance = new Singleton5(); } return instance; } } } //测试方法 public void Hello() { Console.WriteLine("Hello5"); } } /// <summary> /// 两重加锁,减少一重加锁的性能消耗,线程安全 /// </summary> public sealed class Singleton6 { private static Singleton6 instance = null; private static readonly object padlock = new object(); private Singleton6() { } public static Singleton6 Instance { get { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Singleton6(); } } } return instance; } } //测试方法 public void Hello() { Console.WriteLine("Hello6"); } } public sealed class Singleton7 { private Singleton7() { } public static Singleton7 Instance { get { return Nested.instance; } } private class Nested//通过内嵌的私有类做延时初始化 { static Nested() { } private Nested() { } internal static readonly Singleton7 instance = new Singleton7(); } //测试方法 public void Hello() { Console.WriteLine("Hello7"); } } public sealed class Singleton8 { private Singleton8() { } public static Singleton8 Instance { get { return Nested.instance; } } private class Nested { internal static readonly Singleton8 instance = null; static Nested() { instance = new Singleton8();//都是延时初始化,但不同于Singleton7的是静态初始化,类似Singleton1和Singleton2的区别 } private Nested() { } } //测试方法 public void Hello() { Console.WriteLine("Hello8"); } } //对于使用Unity的朋友Singleton4够了 }
相关文章推荐
- 设计模式-工厂模式(手工作坊到工业化的转变 c#实现)
- State模式的经典应用场景:订单处理(c#实现)
- C#实现原型模式
- 利用C#实现标准的 Dispose模式
- Singleton模式在C#与C++中的实现
- 设计模式之C#实现(三)FactoryMethod
- 使用 C# (.NET Core) 实现命令设计模式 (Command Pattern)
- 《模式——工程化实现及扩展》(设计模式C# 版)《中介者模式 Mediator》——“自我检验" 参考答案
- C#实现FactoryMethod模式
- 趣味编程:C#中Specification模式的实现(参考答案 - 下)
- 《模式——工程化实现及扩展》(设计模式C# 版)《模板方法模式 Template》——“自我检验"
- C#的内存管理原理解析+标准Dispose模式的实现
- Unity3D学习之如何利用C#实现代理模式
- 《模式——工程化实现及扩展》(设计模式C# 版)《访问者模式 Visitor》——“自我检验"
- C#中标准Dispose模式的实现
- 改善C#程序的建议4:C#中标准Dispose模式的实现
- C# 反射工厂模式的实现
- 【数据结构】有向图、无向图以及最短路(Dijkstra)算法的C#实现(Template模式)
- 《模式——工程化实现及扩展》(设计模式C# 版)《连贯接口 Fluent Interface》——“自我检验"
- 观察者模式(Publish/Subscribe)(C#实现)