单件模式(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)的更多相关文章

  1. 设计模式 - 单件模式(singleton pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...

  2. C#设计模式——单件模式(Singleton Pattern)

    一.概述在软件开发过程中,我们有时候需要保证一个类仅有一个实例,比如在一个电脑用户下只能运行一个outlook实例.这时就需要用到单件模式.二.单件模式单件模式保证一个类仅有一个实例,并提供一个访问它 ...

  3. 单件模式Singleton来控制窗体被重复或多次打开

    本文转载:http://blog.csdn.net/a0700746/article/details/4473796 一般在百度搜一下,会出来一下内容,看来很好用.Singleton很方便的一个用处就 ...

  4. 设计模式(二)单件模式Singleton(创建型)

    SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...

  5. 设计模式----创建型型模式之单件模式(Singleton pattern)

    单件模式,又称单例模式,确保一个类只有一个实例,并提供全局访问点. 单件模式是比较简单且容易理解的一种设计模式.只有一个实例,通常的做法...TODO 类图比较简单,如下所示: 示例代码: 懒汉模式( ...

  6. 夜话JAVA设计模式之单例模式(单件模式Singleton)

    单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点. 设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例. 下面来看金 ...

  7. NET中的设计模式---单件模式

    如众所知,单件模式做为<Gof 23中设计模式>之一,其意图仅允许单件类的一个实例存在(扩展单件模式不在此文范围内),并提供全局的访问方法.UML类图如下. http://csharpin ...

  8. C#设计模式——单件模式

    一.为何需要单件模式 需求 我们开发了一个大型的项目,其中存在许多的工具类.但是其中很多的工具类我们并不是经常使用得到,甚至 一次都不会使用.但是这些工具类都是静态的类,会消耗很多的内存,即使一次都不 ...

  9. [MyBean-说明书]关于插件的单件模式(singleton),插件的共享模式

    [说明] 单件模式是一种用于确保整个应用程序中只有一个类实例. 想想我们的系统中有哪些方面可以应用到单件模式,比如大家常说的连接(ADOConnection)共享,其实就是指的单件模式. [MyBea ...

随机推荐

  1. ApplicationContext,WebApplicationContext

    servletContext 是web应用程序的大环境,用于存储整个web应用程序级别的对象. ApplicationContext,WebApplicationContext 是Spring的Bea ...

  2. 关于scarpy的一些说明

    一  scrapy添加代理 1 内置代理:os.environ. 固定格式,不推荐 os.environ['http_proxy'] = "http://root:woshiniba@192 ...

  3. hdu 4870 rating(高斯消元求期望)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. “百度杯”CTF比赛 九月场_Test(海洋cms前台getshell)

    题目在i春秋ctf训练营 又是一道cms的通用漏洞的题,直接去百度查看通用漏洞 这里我使用的是以下这个漏洞: 海洋CMS V6.28代码执行0day 按照给出的payload,直接访问url+/sea ...

  5. UVA - 10196:Check The Check

    类型:简单模拟 大致题意:已知国际象棋行棋规则,给你一个局面,问是否将军?谁将谁的军?(保证不会同时将军) 思路:都以小写字母 测试 是否将 大写字母. 然后一个局面测两次(一次直接测,一次反转棋盘, ...

  6. AC日记——Count on a tree bzoj 2588

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  7. 关于微信浏览器不支持offset()的兼容性处理

    问题的背景: 在手机触屏版中,当页面向上滑动的时候,导航条可以固定在顶部,通过判断offset().top的值来实现这个功能,其他的浏览器都可以,只有微信浏览器中出现问题(向上滑动的时候,导航条就会直 ...

  8. HOJ - 2543最小费用流

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2543 这个题目挺有意思. 自己扣了一会儿,发现图挺好建,就把(u,v,f,w) 拆成(u,v,f,0) ...

  9. Codeforces Gym 100203G Good elements 暴力乱搞

    原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 考虑暴力的复杂度是O(n^3),所以 ...

  10. Hdoj 3506 Monkey Party

    Discription Far away from our world, there is a banana forest. And many lovely monkeys live there. O ...