索引:

目录索引

一、说明

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

  重要的事情说三遍:

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

  初始化时:

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 周五

     

                    

Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践的更多相关文章

  1. Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式

    1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...

  2. 反射:获取Class对象的三种方式

    获取Class对象的三种方式 package lianxiApril18; /** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型( ...

  3. Singleton 单例模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Singleton - 单例模式和Double-Checked Locking - 双重检查锁定模式

    问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进 ...

  5. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  6. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  7. singleton单例模式

    单例设计模式 单例设计模式概述    单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供    优点:    在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...

  8. 基于webstorm卡顿问题的2种解决方法

    基于webstorm卡顿问题的2种解决方法:https://www.jb51.net/article/128441.htm

  9. Thomas Brinkhoff 基于路网的移动对象生成器的使用

    Thomas Brinkhoff 基于路网的移动对象生成器的使用 网站:http://iapg.jade-hs.de/personen/brinkhoff/generator/ 各个移动对象在路网中进 ...

  10. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

随机推荐

  1. SQL-union

    集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定.(可以用来连接多个结果)联合(union)与连接(jo ...

  2. PMON failed to acquire latch, see PMON dump

    前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...

  3. SQLSERVER中NULL位图的作用

    SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...

  4. Threadlocal使用Case

    Threadlocal能够为每个线程分配一份单独的副本,使的线程与线程之间能够独立的访问各自副本.Threadlocal 内部维护一个Map,key为线程的名字,value为对应操作的副本. /** ...

  5. Linux 中我该如何备份系统

    系统备份概述 在前面的一些文章中,我反复提到经常会把系统搞崩溃,所以备份系统就是一件不容忽视的事情.由于 Linux 系统本身的优越性,系统的备份和还原还是比较容易的.主要表现在以下方面: Linux ...

  6. 我所理解的SOA和微服务

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...

  7. Tomcat 8熵池阻塞变慢详解(putty)

    原因 Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRand ...

  8. Oracle数据库操作知道

    SELECT TGTID,PHONENUM,REGISTERDATE ,to_date(REGISTERDATE,'YYYY-MM-DD HH24:MI:SS') AS T FROM WTRESSEN ...

  9. iOS----应用的旋转---Orientations

    此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. QQ : 1101819159 邮箱: GeekiVan@aliyun. ...

  10. ReactJs 报错 Element type is invalid: expected a string (from built-in components) or a class/function (for composite components) but got: undefined. Check the render method of `Me`.

    今天在重构一个页面的时候,碰到了一个error,具体的error信息如下图中所示: 最后经过一番查找定位,终于找到了问题所在,原因就是在父组件引用子组件时多加了一个大括号. import {Chart ...