单例模式(Singleton Pattern)

 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

使用场景:
整个项目需要一个共享访问点,共享数据
创建的对象需要消耗资源过多
需要定义大量的静态常量和方法(工具类)

最佳实践:
如果单例在内存长久不使用,则会被认为是垃圾而销毁,可以由容器管理单例的生命周期,也可以记录状态变化,确保重新初始化之后获得销毁前的数据,,避免丢失。

原文地址:https://www.cnblogs.com/leestar54/p/5800161.html