创建型设计模式之-单例

创建型设计模式关注类怎么创建(实例化)

单例模式:就是一个进程中只有一个实例。为啥要用单例,很多人误解他的使用条件。单例是这个类实例化很消耗资源,而且频繁使用,就用单例模式。当我是小小白时,就只是以为调用里面的方法、属性操作很方便!还有人误解为多线程才用单例。单例也不是越多越好。因为这个实例是静态的。进程结束后才会销毁资源,所以你单例用多了,很多资源不是交给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 }
View Code

 

静态构造函数,程序启动时,由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 }
View Code

 

单例模式中的延迟加载 

延迟加载或延迟加载是一种设计模式,或者您可以说这是一个概念,通常用于将对象的初始化延迟到需要时。因此,延迟加载的主要目标是按需加载对象,或者您可以根据需要说出对象。

作为 .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 }
View Code

 

posted @ 2021-07-20 12:33  小换哥  阅读(31)  评论(0编辑  收藏  举报