• 单例定义:

    确保一个类只有一个实例,并提供全局访问点。

  • 适用场景:

    1.) 当系统中某个类必须仅有一个实例对象,同时访问该系统的所有访问者必须访问同一个实例对象时,且该对象实例自身占用资源又不大时。

    2.) 在C/s应用程序中,当我们要保证某一个非模式窗口,只能显示一个实例时。

  • 举例适用场景:

    线程池(threadpool)、缓存(cache)、对话框、处理编好设置和注册表(registry)的对象、日志对象,充当打印机、显卡等设备的驱动程序对象。这些类对象只能有一个实例,如果造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源适用过量,或者是不一致的结果。

  • 实现推荐方案:   
  1. /// <summary>
  2. /// Description of SiteSettings.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance=null;
  7. private static object locker=new object();
  8.  
  9. private SiteSettings()
  10. {
  11. }
  12.  
  13. public static SiteSettings Instance {
  14. get {
  15. if(instance==null)
  16. {
  17. Console.WriteLine("Install equals null.");
  18. lock(locker)
  19. {
  20. if(instance ==null)
  21. {
  22. Console.WriteLine("new SiteSettings instance.");
  23. instance=new SiteSettings();
  24. }
  25. }
  26. }
  27. return instance;
  28. }
  29. }
  30.  
  31. private bool siteClosed=false;
  32.  
  33. public bool SiteClosed {
  34. get { return siteClosed; }
  35. set { siteClosed = value; }
  36. }
  37. }

  调用:

  1. class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. Console.WriteLine("Hello World!");
  6.  
  7. // TODO: Implement Functionality Here
  8.  
  9. Console.WriteLine(SiteSettings.Instance.SiteClosed);
  10. Console.WriteLine(SiteSettings.Instance.SiteClosed);
  11. SiteSettings.Instance.SiteClosed=true;
  12. Console.WriteLine(SiteSettings.Instance.SiteClosed);
  13.  
  14. Console.Write("Press any key to continue . . . ");
  15. Console.ReadKey(true);
  16. }
  17. }

  运行结果:

  • 其他实现方案:

  1.) 方案1     

  1. /// <summary>
  2. /// Description of MemberBO.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance=null;
  7. private static object locker=new object();
  8.  
  9. private SiteSettings()
  10. {
  11. }
  12.  
  13. public static SiteSettings Instance {
  14. get {
  15. if(instance ==null){
  16. Console.WriteLine("Install equals null.");
  17. lock(locker){
  18. Console.WriteLine("Enter locker.");
  19. Console.WriteLine("new SiteSettings instance.");
  20. instance=new SiteSettings();
  21. }
  22. }
  23. return instance;
  24. }
  25. }
  26.  
  27. private bool siteClosed=false;
  28.  
  29. public bool SiteClosed {
  30. get { return siteClosed; }
  31. set { siteClosed = value; }
  32. }
  33. }

  2.) 方案2:     

  1. /// <summary>
  2. /// Description of MemberBO.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance=null;
  7. private static object locker=new object();
  8.  
  9. private SiteSettings()
  10. {
  11. }
  12.  
  13. public static SiteSettings Instance {
  14. get {
  15. Console.WriteLine("Install equals null.");
  16. lock(locker){
  17. if(instance ==null){
  18. Console.WriteLine("Enter locker.");
  19. Console.WriteLine("new SiteSettings instance.");
  20. instance=new SiteSettings();
  21. }
  22. }
  23. return instance;
  24. }
  25. }
  26.  
  27. private bool siteClosed=false;
  28.  
  29. public bool SiteClosed {
  30. get { return siteClosed; }
  31. set { siteClosed = value; }
  32. }
  33. }

  3.) 方案3: 

  1. /// <summary>
  2. /// Description of MemberBO.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance=null;
  7. private static object locker=new object();
  8.  
  9. private SiteSettings()
  10. {
  11. }
  12.  
  13. public static SiteSettings Instance {
  14. get {
  15. Console.WriteLine("Install equals null.");
  16. if(instance ==null){
  17. Console.WriteLine("new SiteSettings instance.");
  18. instance=new SiteSettings();
  19. }
  20. }
  21. return instance;
  22. }
  23. }
  24.  
  25. private bool siteClosed=false;
  26.  
  27. public bool SiteClosed {
  28. get { return siteClosed; }
  29. set { siteClosed = value; }
  30. }
  31. }

  4.) 方案4:

  1. /// <summary>
  2. /// Description of SiteSettings.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance= new SiteSettings();
  7.  
  8. private SiteSettings()
  9. {
  10. }
  11.  
  12. public static SiteSettings Instance {
  13. get {
  14. return instance;
  15. }
  16. }
  17.  
  18. private bool siteClosed=false;
  19.  
  20. public bool SiteClosed {
  21. get { return siteClosed; }
  22. set { siteClosed = value; }
  23. }
  24. }

  5.) 方案5:

  1. /// <summary>
  2. /// Description of SiteSettings.
  3. /// </summary>
  4. public class SiteSettings
  5. {
  6. private static SiteSettings instance=null;
  7. private static object locker=new object();
  8.  
  9. private SiteSettings()
  10. {
  11. }
  12.  
  13. public static SiteSettings GetInstance() {
  14. if(instance==null){
  15. locker(locker){
  16. if(instance==null){
  17. instance=new SiteSettings();
  18. }
  19. }
  20. }
  21. return instance;
  22. }
  23.  
  24. private bool siteClosed=false;
  25.  
  26. public bool SiteClosed {
  27. get { return siteClosed; }
  28. set { siteClosed = value; }
  29. }
  30. }
  • 为什么不推荐方案1,方案2,方案3:
  1. 方案1,虽然考虑了线程安全,但还不是足够的安全,还没有双重锁定安全
  2. 方案2,虽然考虑了线程安全,但每次都要进入locker,即使instance对象已经赋值后
  3. 方案3,线程安全问题就没有考虑。
  • 适当的情况下可以选择方案4,方案5
  1. 方案4,使用“迫切”创建实例(当应用程序启动,初始化系统时,初始化全局变量时创建对象实例),而不用延迟实例化的方法
  2. 方案5,采用了延迟实例化的方法。
  • 注意混淆问题:

  不要和Monitor,ReaderWriterLockSlim等这些线程安全的使用方式混淆。

1.) Monitor:提供同步访问对象的机制。

2.) ReaderWriterLockSlim:表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。

  • 优缺点:

  1.)优点:

    a.)确保了系统中保存一个实例对象,为程序带来了开拓思路;

    b.)内存开销可能会占用一定空间,但它避免了每次都需要开辟空间的消费;

    c.)使得程序能逻辑清理,开发者可以单一的使用该实例对象去操作,而不别每次都要new一个实例对象来进行操作。

  2.缺点:

    a.)多个用户在操作这个对象时,线程的安全性,就需要考虑。

    b.)一直在占用资源,而不可以被回收。

参考资料:《Head First 设计模式》

  欢迎拍砖!请牛人们给指点。

Singlton设计模式的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

随机推荐

  1. os

    内核,Shell和文件结构一起形成了基本的操作系统结构. from:大学生攻克Linux系统教程(又名天下没有难学的Linux) 发问: 0-内核,再怎么分出层次呢?

  2. Java Web项目调优原则

    1. 根据oracle生成的awr文件排除是否是数据库或者sql问题 2.配置中间件的dump文件路径,gc log文件路径 3.通过 MemoryAnalyzer 分析 dump文件 4.通过exc ...

  3. Android源码剖析之Framework层进阶版(Wms窗口管理)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管 ...

  4. JS懒加载

    4.如何使用js懒加载图片       a.懒加载图片是基于jquery.js的,所以: <script src="jquery.js" type="text/ja ...

  5. Eclipse插件项目 引用其他类库的方法(jar)

    这两天搞了个Eclipse插件项目,用来监测ios.android设备和电脑的连接,安装apk/ipa到对应设备等等功能. 遇到了build path下的library引入编译正常,运行时报Class ...

  6. hdu1231最大连续子序列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1231 #include<iostream> #include<cstdio> ...

  7. Java学习-037-JavaWeb_006 -- JSP 动作标识 - include

    这个动作是指在当前的页面中包含一个或多个 JSP 页面或者 HTML 文件,语法:<jsp:include file="../jsp/login.jsp" flush=&qu ...

  8. imx6 kernel clock

    前段时间查看了uboot的时钟,kernel的也稍微了解了下,记录于此,以后再来补充完善. board-mx6q_sabresd.c MACHINE_START(MX6Q_SABRESD, " ...

  9. C语言:其他进制数转换为十进制(方法一)

    #include<stdio.h> #include<math.h> #include<string.h> //其他任意进制转换为十进制 int main() { ...

  10. less 命令(转)

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...