通用单例模式
2016-06-03 22:22
337 查看
单例模式
单例模式是许多开发人员最先接触到的模式之一,可以认为就是一个全局变量。它的初始化过程无非就是一开始就是创建一个实例,或者延迟初始化等需要用到的时候创建一个实例。这里需要注意的是多线程情况下创建一个实例,通常需要加锁(Lock)来解决问题。这里我们可以利用C#的系统函数Interlocked.CompareExchange来实现。
1 常用单例模式
internal class SingletonOne { private static SingletonOne _singleton; private SingletonOne(){} public static SingletonOne Instance { get { if(_singleton==null) { Interlocked.CompareExchange(ref _singleton,new SingletonOne(),null); } return _singleton; } } }
2 通用单例模式
/// <summary> /// 通用单例模式 /// </summary> /// <typeparam name="T">泛型</typeparam> public class Singleton<T> { static Dictionary<Type, object> _lockers = new Dictionary<Type, object>(); static T _instance; /// <summary> /// 获取对象实例 /// </summary> /// <param name="parameters">参数</param> /// <returns></returns> public static T GetInstance(params object[] parameters) { if (_instance == null) { Type type = typeof(T); var locker = _lockers.GetOrDefault(type); if (locker == null) { lock (_lockers) { locker = _lockers.Get(type, x => new object()); } } lock (locker) { if (_instance == null) { var cons = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) .FirstOrDefault(); _instance = (T)cons.Invoke(parameters); } } } return _instance; } }
相关文章推荐
- ES 父子文档查询
- 腾讯新版MSDK for Unity
- 从多个表中检索记录
- 学术诚信与职业道德 感受
- 关于提高webview里下载apk安装包成功率的研究
- servlet向mysql插入中文时乱码解决
- 程序猿的转型
- 巴特沃斯(Butterworth)滤波器 (2) - 双线性变换
- 1007. 素数对猜想 (20)
- 全排列(next_permutation)
- 贪心法——区间覆盖问题
- HBuild Hybrid App开发(四)相册/拍照-图片上传
- 6.3学习记录
- 使用keepalived实现双机热备
- 之前的实习--关于Web部分的笔记
- C primer plus 第十章 练习8:
- Linux下php+nginx环境的搭建
- 车牌识别
- docker中import "C"的用法,Go与C语言的互操作
- leetcode 21. Merge Two Sorted Lists