创建型设计模式关注类怎么创建(实例化)
单例模式:就是一个进程中只有一个实例。为啥要用单例,很多人误解他的使用条件。单例是这个类实例化很消耗资源,而且频繁使用,就用单例模式。当我是小小白时,就只是以为调用里面的方法、属性操作很方便!还有人误解为多线程才用单例。单例也不是越多越好。因为这个实例是静态的。进程结束后才会销毁资源,所以你单例用多了,很多资源不是交给GC去回收。导致资源浪费!!
C#单例模式:饿汉式、懒汉式单例模式
先说饿汉式:也就是第一次调用的时候才创建
首先第一个条件:一个进程只有一个实例,怎么保证!那就是不能被外面随便new()。所以类内部是私有的构造函数。
public class Singleton { private Sington() { } private static Singleton _Singleton = null; private static object Singleton_Lock = new object(); //锁同步 public static Singleton CreateInstance() { lock (Singleton_Lock) { if (_Singleton == null) { _Singleton = new Singleton(); } } return _Singleton; } }
那为啥要用lock。因为怕多线程来了同时创建几个实例,也就不能保证单例了。
那为啥要两个if判断呢。这样想,第一次请求性并发2个以上的线程,同时走到第一个if里面。然后lock里面进去一个线程,然后在if判断,才开始创建实例。然后走出去,然后lock前面的第二个线程进去lock代码,如果不加这个if判断,是不是会重新new(),就不是一次实例了,所以要双if判断。
饿汉式:就是程序一启动就创建好了。不需要用的时候才new。饿汉嘛,比较积极!
1 public class Singleton 2 { 3 private static Singleton _Singleton = null; 4 5 static Singleton() 6 { 7 8 _Singleton = new Singleton(); 9 } 10 11 public static Singleton CreateInstance() 12 { 13 return _Singleton; 14 } 15 }
静态构造函数,程序启动时,由CLR创建,所以比较积极,你用没用,他都已经被创建了。
还有静态的变量实现单例,和上面同理,也是饿汉式的
1 public sealed class Singleton 2 { 3 private Singleton() { } 4 5 private static readonly Singleton singleInstance = new Singleton(); 6 7 public static Singleton GetInstance 8 { 9 get 10 { 11 return singleInstance; 12 } 13 } 14 }
单例模式中的延迟加载
延迟加载或延迟加载是一种设计模式,或者您可以说这是一个概念,通常用于将对象的初始化延迟到需要时。因此,延迟加载的主要目标是按需加载对象,或者您可以根据需要说出对象。
作为 .NET Framework 4.0 的一部分引入的惰性关键字为惰性初始化(即按需对象初始化)提供了内置支持。如果要使对象(如 Singleton)以延迟初始化,则只需将对象的类型(单例)传递给lazy 关键字,如下所示。
1 public sealed class Singleton 2 { 3 private Singleton() 4 {} 5 6 private static readonly Lazy<Singleton> Instancelock = 7 new Lazy<Singleton>(() => new Singleton()); 8 9 public static Singleton GetInstance 10 { 11 get 12 { 13 return Instancelock.Value; 14 } 15 } 16 }