创建型模式:单例

1.所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。

2.类的构造方法写成private的,那么外部就不能通过new去实例化它了。

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

懒汉式单例类:要在第一次被引用时,才会将自己实例化,所以被称为懒汉式单例类。

 1     /// <summary>
 2     /// 单例模式
 3     /// </summary>
 4     public class Singleton
 5     {
 6         private static Singleton instance;
 7 
 8         //私有的构造函数,防止外部使用new创建该类的实例
 9         private Singleton(){}
10 
11         //获得本类实例的唯一全局访问点
12         public static Singleton GetInstance()
13         {
14             if (instance==null)
15             {
16                 instance = new Singleton();
17             }
18             return instance;
19         }
20     }

多线程时的单例:

 1     /// <summary>
 2     /// 单例模式
 3     /// </summary>
 4     public class Singleton
 5     {
 6         private static Singleton instance;
 7 
 8         //程序运行时创建一个静态只读的进程辅助对象
 9         private static readonly object syncRoot = new object();
10 
11         //私有的构造函数,防止外部使用new创建该类的实例
12         private Singleton(){}
13 
14         //获得本类实例的唯一全局访问点
15         /*  lock:确保当一个线程位于代码的临界区时,另外一个线程不进入临界区。
16             如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止)
17             直到该对象被释放(MSDN)
18          */
19         public static Singleton GetInstance()
20         {
21             //第一种加锁方式:每次调用GetInstance都需要lock,会影响性能.
22             //在同一时刻加了锁的那部分程序只有一个线程可以进入
23             lock (syncRoot)
24             {
25                 if (instance == null)
26                 {
27                     instance = new Singleton();
28                 }
29             }
30             //第二种加锁方式(双重锁定)先判断实例是否创建,未创建再加锁处理同时也能保证多线程的安全。
31             if (instance==null)
32             {
33                 lock (syncRoot)
34                 {
35                     if (instance==null)
36                     {
37                         instance = new Singleton();
38                     }
39                 }
40             }
41             return instance;
42         }
43     }

饿汉单例类:这种静态初始化的方式是自己在加载时就将自己实例化,所以形象的被称为饿汉式单例类

 1     /// <summary>
 2     /// 饿汉单例模式(静态初始化)
 3     /// sealed(密封类)阻止发生派生,而派生可能会增加实例
 4     /// </summary>
 5     public sealed class Singleton
 6     {
 7         //在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
 8         private static readonly Singleton instance = new Singleton();
 9 
10         private Singleton() { }
11 
12         public static Singleton GetInstance()
13         {
14             return instance;
15         }
16     }

饿汉式单例类和懒汉式单例类的区别:

饿汉式(即静态初始化的方式):它是类一加载就实例化对象,所以要提前占用系统资源。

懒汉式:会面临多线程访问的安全性问题,需要做双重锁定处理才可以保证线程安全。

原文地址:https://www.cnblogs.com/wgx0428/p/4022838.html