1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DesignPattern.SingletonPattern 7 { 8 /// <summary> 9 /// 地球只有一个吧??所以单例一个地球 10 /// </summary> 11 class Earth 12 { 13 /// <summary> 14 /// 在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。 15 /// </summary> 16 private static readonly Earth singleton = new Earth(); 17 18 private Earth() 19 { 20 } 21 22 public static Earth getEarth() 23 { 24 return singleton; 25 } 26 27 /// <summary> 28 /// 公开一个全局方法,下雨~! 29 /// </summary> 30 public void Rain() 31 { 32 Console.WriteLine("哗啦啦啦天在下雨!!!!"); 33 } 34 35 } 36 37 /// <summary> 38 /// 线程安全的单例,延迟加载,双重校验锁 39 /// </summary> 40 public class Singleton 41 { 42 private static Singleton singleton = null; 43 static readonly object lazylock = new object(); 44 public static Singleton getInstance() 45 { 46 if (singleton == null) 47 { 48 lock (lazylock) 49 { 50 if (singleton == null) 51 { 52 singleton = new Singleton(); 53 } 54 } 55 } 56 return singleton; 57 } 58 } 59 }
Earth earth = Earth.getEarth();
earth.Rain();
优点:
减少内存开支
减少性能开销
避免资源多重占用
拥有全局访问点
缺点:
一般没有接口,难以扩展。
测试不利,没有接口无法mock
使用场景:
整个项目需要一个共享访问点,共享数据
创建的对象需要消耗资源过多
需要定义大量的静态常量和方法(工具类)
最佳实践:
如果单例在内存长久不使用,则会被认为是垃圾而销毁,可以由容器管理单例的生命周期,也可以记录状态变化,确保重新初始化之后获得销毁前的数据,,避免丢失。