Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践
索引:
一、说明
本文中的代码类,在生产中使用了很长的时间,曾应用于多个企业多个项目实践中,其中也踩了不少坑,总结了一些适用的业务情景,
重要的事情说三遍:
a.本代码类不是万能药,不要在业务情景中滥用!
b.本代码类是有效的可用的经典的,但不要在业务情景中滥用!!
c.本代码类是经过实践考验的,可放心使用,但不要在业务情景中滥用!!!
具体滥用后会踩中什么坑呢?嘿嘿~~认真看下面代码结合自己业务应用,自己分析问题~~
二、代码
废话不多说,代码如下:
/// <summary>
/// 惰性泛型单例
/// </summary>
public class LazyInstance<T>
where T : class,new()
{
private static Lazy<T> lazyObj = new Lazy<T>(() => new T()); public static T Instance
{
get
{
return lazyObj.Value;
}
}
}
LazyInstance.cs
三、.NET 内置类及代码说明
查看MSDN文档,Lazy<T> 类,https://msdn.microsoft.com/zh-cn/library/dd642331(v=vs.110).aspx :
//
// 摘要:
// 提供对延迟初始化的支持。
//
// 类型参数:
// T:
// 指定正在延迟初始化的对象的类型。
public class Lazy<T>
{ }
//
// 摘要:
// 初始化 System.Lazy`1 类的新实例。发生延迟初始化时,使用指定的初始化函数。
//
// 参数:
// valueFactory:
// 在需要时被调用以产生延迟初始化值的委托。
//
// 异常:
// T:System.ArgumentNullException:
// valueFactory 为 null。
public Lazy(Func<T> valueFactory);
//
// 摘要:
// 获取当前 System.Lazy`1 实例的延迟初始化值。
//
// 返回结果:
// 当前 System.Lazy`1 实例的延迟初始化值。
//
// 异常:
// T:System.MemberAccessException:
// System.Lazy`1 实例初始化为使用正在惰性初始化的类型的默认构造函数,并且缺少访问该构造函数的权限。
//
// T:System.MissingMemberException:
// System.Lazy`1 实例初始化为使用正在惰性初始化的类型的默认构造函数,并且该类型没有无参数的公共构造函数。
//
// T:System.InvalidOperationException:
// 初始化函数尝试访问此实例上的 System.Lazy`1.Value。
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public T Value { get; }
Lazy<T> 类,我们说完了,若果还不明白就自己搜索一下,接下来说一下使用此类怎么构成了单例:
初始化时:
private static Lazy<T> lazyObj = new Lazy<T>(() => new T());
在使用某个实例类时,例如 class A ,总是使用 A.Instance,而该属性总是返回Lazy<T>.Value:
public static T Instance
{
get
{
return lazyObj.Value;
}
}
注意,上面都是用static修饰的,典型的构造函数赋值静态属性,实例使用静态属性保存值,只不过巧妙的借用了.NET内置的Lazy<T> 类,
完成实现了经典的单例模式,同时省去了锁,惰性等实现代码,同时代码超级稳定!
四、使用方式
定义一个类:
public class ClassA : LazyInstance<ClassA>
{
public string Test()
{
return "惰性泛型单例!";
}
}
在方法中使用这个类:
public void Invoke()
{
var result = ClassA.Instance.Test();
}
蒙
2016-09-30 23:11 周五
Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践的更多相关文章
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- 反射:获取Class对象的三种方式
获取Class对象的三种方式 package lianxiApril18; /** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型( ...
- Singleton 单例模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Singleton - 单例模式和Double-Checked Locking - 双重检查锁定模式
问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进 ...
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
...
- singleton单例模式
单例设计模式 单例设计模式概述 单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供 优点: 在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...
- 基于webstorm卡顿问题的2种解决方法
基于webstorm卡顿问题的2种解决方法:https://www.jb51.net/article/128441.htm
- Thomas Brinkhoff 基于路网的移动对象生成器的使用
Thomas Brinkhoff 基于路网的移动对象生成器的使用 网站:http://iapg.jade-hs.de/personen/brinkhoff/generator/ 各个移动对象在路网中进 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
随机推荐
- 编写简单的Makefile文件
makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c x.h 表示生成www这个文件需 ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- 端盘子的服务生到月薪一万五的IT精英,你能相信吗
一直以来,我都觉得自己不是一个有故事的人. 以前的我,是个乖宝宝,对父母言听计从,特别内向,甚至一度感觉到自卑.不上学之后,我干过送货员,去工地除泥搬砖,当过油漆工,去过工厂,还去饭店当过端盘子的服务 ...
- linux常用命令(2)pwd命令
pwd 命令1 命令格式:pwd [选项]2 命令功能查看当前工作目录的完整路径3 常用参数一般不带任何参数如果目录是链接时:pwd -P 显示实际路径,而非使用链接路径4 常用实例:4.1 用pwd ...
- 程序员装B指南
一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...
- 一步步开发自己的博客 .NET版(9、从model first替换成code first 问题记录)
为什么要改用code first 用过code first的基本上都不会再想用回model first或是db first(谁用谁知道).不要问我为什么不一开始就直接使用code first,因为那个 ...
- 你从未知道如此强大的ASP.NET MVC DefaultModelBinder
看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的modelbinder,以为很 ...
- 细说SSO单点登录
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- 设计模式之合成/聚合利用原则(CARP)
一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has a”的关系,而继承是“is a”的 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图