zoukankan      html  css  js  c++  java
  • 创建型设计模式之-单例

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

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

    本文来自博客园,作者:小换哥,转载请注明原文链接:https://www.cnblogs.com/haunge/p/15034286.html

  • 相关阅读:
    k8s创建rabbitmq集群
    k8s创建redis集群
    azure devops server自动生成容器镜像部署到k8s
    azure devops 自动编译生成项目
    部署 Kubernetes 高可用集群
    camstar 服务健康检查和故障自动恢复
    keepalived 配置
    解决k8s namespace terminating无法删除的问题
    kong网关dbless模式
    camstar MES开发分享
  • 原文地址:https://www.cnblogs.com/haunge/p/15034286.html
Copyright © 2011-2022 走看看