说说设计模式~单件模式(Singleton)
单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点。
从概念上来研究一下它的实现,不考虑线程安全

- 1 public sealed class Singlton
- 2 {
- 3 static Singlton instance = null;
- 4 private Singlton() { }
- 6
- 7 public static Singlton Instance
- 8 {
- 9 get
- 10 {
- 11 if (instance == null)
- 12 {
- 13 instance = new Singlton();
- 14 }
- 15 return instance;
- 16 }
- 17 }
- 18 }

上面的实现方式,对于多线程会有问题,因为Singlton 对象可能不指一次被创建,而罪魁祸首就是if (instance == null)这句话,它并不是线程安全的。
如果希望实现线程安全的单件,我们最先想到的应该就是借助lock机制来实现,代码可能是这样:

- 1 public sealed class Singlton
- 2 {
- 3 static Singlton instance = null;
- 4
- 5 static readonly object o = new object();
- 6
- 7 Singlton()
- 8 { }
- 9
- 10 public static Singlton Instance
- 11 {
- 12 get
- 13 {
- 14 lock (o)
- 15 {
- 16 if (instance == null)
- 17 {
- 18 instance= new Singlton();
- 19 }
- 20 21 }
return instance;- 22 }
- 23 }
- 24 }

而我们使用静态对象在静态结构方法里为它进行初始化,这种方式也非常在程序中看到,如:

- 1 public sealed class Singlton
- 2 {
- 3 static readonly Singlton instance = null;
- 4
- 5 static Singlton()
- 6 { instance = new Singlton();}
- 7
- 8 public static Singlton Instance
- 9 {
- 10 get
- 11 {
- 12 return instance;
- 13 }
- 14 }
- 15 }

这种方法及其它单件模式有一个问题,就是如果希望去更新单件对象的值,是无法实现的,比如,instance对象希望从数据库中取出一个列表,而列表的信息有可能
发生变化,怎样保证instance里取的是最新的信息呢,这样我们可以在单件中引入时间触发器的概念,代码如下:

- 1 public class CategoryRepository : Car_RentalRepositoryBase, ICategoryRepository
- 2 {
- 3 #region 静态树结构,每1分钟去获一下数据库
- 4 static List<Category> categoryList = null;
- 5 /// <summary>
- 6 /// 数据实体
- 7 /// </summary>
- 8 public static volatile List<Category> Instance = null;
- 9 static CategoryRepository categoryRepository = new CategoryRepository();
- 10 static System.Timers.Timer sysTimer = new System.Timers.Timer(600000);
- 11 static CategoryRepository()
- 12 {
- 13 Reload();//第一次加载
- 14 sysTimer.AutoReset = true;
- 15 sysTimer.Enabled = true;
- 16 sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);
- 17 sysTimer.Start();
- 18 }
- 19
- 20 /// <summary>
- 21 /// 被订阅了Elapsed事件的方法,每隔一段时间去重新获取数据列表
- 22 /// </summary>
- 23 /// <param name="sender"></param>
- 24 /// <param name="e"></param>
- 25 static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- 26 {
- 27 Reload();
- 28 }
- 29
- 30 internal static void Reload()
- 31 {
- 32 categoryList = categoryRepository.GetModel().OrderBy(i => i.SortNumber).ToList();
- 33 Instance = categoryList.Where(i => i.ID != 1).ToList();
- 34 }
- 35 }

这种方式解决了实例不能获取最新的问题。
最后,奉献出国外牛人写了的泛型单件类,如果实现的类直接继承它即可。

- 1 /// <summary>
- 2 /// 泛型单例基类
- 3 /// </summary>
- 4 public abstract class Singleton<TEntity> where TEntity : class
- 5 {
- 6 private static readonly Lazy<TEntity> _instance
- 7 = new Lazy<TEntity>(() =>
- 8 {
- 9 var ctors = typeof(TEntity).GetConstructors(
- 10 BindingFlags.Instance
- 11 | BindingFlags.NonPublic
- 12 | BindingFlags.Public);
- 13 if (ctors.Count() != 1)
- 14 throw new InvalidOperationException(String.Format("Type {0} must have exactly one constructor.", typeof(TEntity)));
- 15 var ctor = ctors.SingleOrDefault(c => c.GetParameters().Count() == 0 && c.IsPrivate);
- 16 if (ctor == null)
- 17 throw new InvalidOperationException(String.Format("The constructor for {0} must be private and take no parameters.", typeof(TEntity)));
- 18 return (TEntity)ctor.Invoke(null);
- 19 });
- 20
- 21 public static TEntity Instance
- 22 {
- 23 get { return _instance.Value; }
- 24 }
- 25 }
说说设计模式~单件模式(Singleton)的更多相关文章
- 设计模式 - 单件模式(singleton pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...
- C#设计模式——单件模式(Singleton Pattern)
一.概述在软件开发过程中,我们有时候需要保证一个类仅有一个实例,比如在一个电脑用户下只能运行一个outlook实例.这时就需要用到单件模式.二.单件模式单件模式保证一个类仅有一个实例,并提供一个访问它 ...
- 单件模式Singleton来控制窗体被重复或多次打开
本文转载:http://blog.csdn.net/a0700746/article/details/4473796 一般在百度搜一下,会出来一下内容,看来很好用.Singleton很方便的一个用处就 ...
- 设计模式(二)单件模式Singleton(创建型)
SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...
- 设计模式----创建型型模式之单件模式(Singleton pattern)
单件模式,又称单例模式,确保一个类只有一个实例,并提供全局访问点. 单件模式是比较简单且容易理解的一种设计模式.只有一个实例,通常的做法...TODO 类图比较简单,如下所示: 示例代码: 懒汉模式( ...
- 夜话JAVA设计模式之单例模式(单件模式Singleton)
单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点. 设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例. 下面来看金 ...
- NET中的设计模式---单件模式
如众所知,单件模式做为<Gof 23中设计模式>之一,其意图仅允许单件类的一个实例存在(扩展单件模式不在此文范围内),并提供全局的访问方法.UML类图如下. http://csharpin ...
- C#设计模式——单件模式
一.为何需要单件模式 需求 我们开发了一个大型的项目,其中存在许多的工具类.但是其中很多的工具类我们并不是经常使用得到,甚至 一次都不会使用.但是这些工具类都是静态的类,会消耗很多的内存,即使一次都不 ...
- [MyBean-说明书]关于插件的单件模式(singleton),插件的共享模式
[说明] 单件模式是一种用于确保整个应用程序中只有一个类实例. 想想我们的系统中有哪些方面可以应用到单件模式,比如大家常说的连接(ADOConnection)共享,其实就是指的单件模式. [MyBea ...
随机推荐
- Docker 使用指南—— 基本操作
版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98来源:腾云阁 https://www.qcloud ...
- Red is good(bzoj 1419)
Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一 ...
- elementui table 分页 和 tabel 前加序列号
记录下来备忘 结构如下 Report.vue <template> <div> <home-header></home-header> <div ...
- 高阶函数之函数柯里化function currying
var cost = (function(){ var args = []; return function(){ if(arguments.length === 0){ ...
- node--http小爬虫&事件模块
//http小爬虫 var http=require('http') var cheerio=require('cheerio') var url='http://www.imooc.com/lear ...
- ubuntu 为firefox 安装flash_player
1.下载安装包install_flash_player_11_linux.i386.tar.gz: 2.解压文件:$ tar -xvf install_flash_player_11_linux.i3 ...
- TextReader 和StreamReader
TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...
- hdu 5461(分类讨论)
Largest Point Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 洛谷——P2983 [USACO10FEB]购买巧克力Chocolate Buying
P2983 [USACO10FEB]购买巧克力Chocolate Buying 题目描述 Bessie and the herd love chocolate so Farmer John is bu ...
- HAXM 6.0.5显示不兼容Windows
HAXM 6.0.5显示不兼容Windows 最近更新Android后,用户会在Android Manager中发现,以前可以安装Intel x86模拟器现在不能安装了.提示错误信息如下:intel ...