zoukankan      html  css  js  c++  java
  • Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践

    索引:

    目录索引

    一、说明

      本文中的代码类,在生产中使用了很长的时间,曾应用于多个企业多个项目实践中,其中也踩了不少坑,总结了一些适用的业务情景,

      重要的事情说三遍:

      a.本代码类不是万能药,不要在业务情景中滥用!

      b.本代码类是有效的可用的经典的,但不要在业务情景中滥用!!

      c.本代码类是经过实践考验的,可放心使用,但不要在业务情景中滥用!!!

      具体滥用后会踩中什么坑呢?嘿嘿~~认真看下面代码结合自己业务应用,自己分析问题~~

    二、代码

      废话不多说,代码如下:

     1     /// <summary>
     2     /// 惰性泛型单例
     3     /// </summary>
     4     public class LazyInstance<T> 
     5         where T : class,new()
     6     {
     7         private static Lazy<T> lazyObj = new Lazy<T>(() => new T());
     8 
     9         public static T Instance
    10         {
    11             get
    12             {
    13                 return lazyObj.Value;
    14             }
    15         }
    16     }
    LazyInstance.cs

    三、.NET 内置类及代码说明

      查看MSDN文档,Lazy<T> 类,https://msdn.microsoft.com/zh-cn/library/dd642331(v=vs.110).aspx :

    1     //
    2     // 摘要:
    3     //     提供对延迟初始化的支持。
    4     //
    5     // 类型参数:
    6     //   T:
    7     //     指定正在延迟初始化的对象的类型。
    8     public class Lazy<T>
    9     { }
     1         //
     2         // 摘要:
     3         //     初始化 System.Lazy`1 类的新实例。发生延迟初始化时,使用指定的初始化函数。
     4         //
     5         // 参数:
     6         //   valueFactory:
     7         //     在需要时被调用以产生延迟初始化值的委托。
     8         //
     9         // 异常:
    10         //   T:System.ArgumentNullException:
    11         //     valueFactory 为 null。
    12         public Lazy(Func<T> valueFactory);
     1         //
     2         // 摘要:
     3         //     获取当前 System.Lazy`1 实例的延迟初始化值。
     4         //
     5         // 返回结果:
     6         //     当前 System.Lazy`1 实例的延迟初始化值。
     7         //
     8         // 异常:
     9         //   T:System.MemberAccessException:
    10         //     System.Lazy`1 实例初始化为使用正在惰性初始化的类型的默认构造函数,并且缺少访问该构造函数的权限。
    11         //
    12         //   T:System.MissingMemberException:
    13         //     System.Lazy`1 实例初始化为使用正在惰性初始化的类型的默认构造函数,并且该类型没有无参数的公共构造函数。
    14         //
    15         //   T:System.InvalidOperationException:
    16         //     初始化函数尝试访问此实例上的 System.Lazy`1.Value。
    17         [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    18         public T Value { get; }

      Lazy<T> 类,我们说完了,若果还不明白就自己搜索一下,接下来说一下使用此类怎么构成了单例:

      初始化时:

     1 private static Lazy<T> lazyObj = new Lazy<T>(() => new T()); 

      在使用某个实例类时,例如 class A ,总是使用 A.Instance,而该属性总是返回Lazy<T>.Value:

    1         public static T Instance
    2         {
    3             get
    4             {
    5                 return lazyObj.Value;
    6             }
    7         }

      注意,上面都是用static修饰的,典型的构造函数赋值静态属性,实例使用静态属性保存值,只不过巧妙的借用了.NET内置的Lazy<T> 类,

      完成实现了经典的单例模式,同时省去了锁,惰性等实现代码,同时代码超级稳定!

    四、使用方式

        定义一个类:

    1     public class ClassA : LazyInstance<ClassA>
    2     {
    3         public string Test()
    4         {
    5             return "惰性泛型单例!";
    6         }
    7     }

      在方法中使用这个类:

    1         public void Invoke()
    2         {
    3             var result = ClassA.Instance.Test();
    4         }

                                             蒙

                                        2016-09-30 23:11 周五

          

                        

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/Meng-NET/p/5925181.html
Copyright © 2011-2022 走看看