面向对象设计模式之Singleton单例模式(创建型)

动机:在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中 只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率

意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点

UML图:

示例代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Singleton
 7 {
 8     /// <summary>
 9     /// 只适用单线程下的单例模式,在多线程下无法保证其唯一实例
10     /// </summary>
11     //public class Singleton
12     //{
13     //    private static Singleton instance;
14     //    private Singleton() { }
15     //    public static Singleton Instance
16     //    {
17     //        get 
18     //        {
19     //            if (instance == null)
20     //            {
21     //                instance = new Singleton();
22     //            }
23     //            return instance;
24     //        }
25     //    }
26     //}
27 
28 
29     /// <summary>
30     /// 第一种:多线程单例模式的设计
31     /// </summary>
32     //public class Singleton
33     //{
34     //    //volatile 会保证编译器不对代码指令的执行调整顺序,而保证其严格意义上的的按顺序执行
35     //    private static volatile Singleton instance=null;
36     //    private static object lockHepler = new object();//起辅助作用
37     //    private Singleton() { }
38     //    public static Singleton Instance
39     //    {
40     //        get
41     //        {
42     //            if (instance==null)
43     //            {
44     //                lock (lockHepler)
45     //                {
46     //                    if (instance == null)
47     //                    {
48     //                        instance = new Singleton();
49     //                    }
50     //                }
51     //            }
52     //            return instance;
53     //        }
54     //    }
55     //}
56 
57     /// <summary>
58     /// 第二种:多线程单例模式的设计
59     /// </summary>
60     public class Singleton
61     {
62         public static readonly Singleton Instance = new Singleton();//内联初始化
63         private Singleton() { }
64     }
65 
66     /// <summary>
67     /// 第二种实现等同于下面的实现,但这两者的弊端:就是不支持参数化传递的构造器
68     /// </summary>
69     //public class Singleton
70     //{
71     //    public static readonly Singleton Instance;
72          
73     //    //.NET机制会保证只有一个线程执行此82行代码,以加锁的方式防止又一个线程执行
74     //    //在第一次访问任意静态字段之前,都会执行静态构造器,以保证静态字段都已初始化
75     //    static Singleton() { Instance = new Singleton(); }
76     //    private Singleton() { }
77     //}
78 
79 }

注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考

原文地址:https://www.cnblogs.com/yja9010/p/3178779.html