最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记。

  在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定义是:Ensure a class only has one instance,and provide a global point of access to。它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个。(《设计模式-基于C#的工程化实现及扩展》,王翔)。也就是说,单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

  一、经典模式:

public class Singleton { private static Singleton instance; private Singleton() { } public staticSingleton GetInstance() { if(instance==null) { instance=new Singleton(); } return instance; } }

  解析如下:

  1)首先,该Singleton的构造函数必须是私有的,以保证客户程序不会通过new()操作产生一个实例,达到实现单例的目的;

  2)因为静态变量的生命周期跟整个应用程序的生命周期是一样的,所以可以定义一个私有的静态全局变量instance来保存该类的唯一实例;

  3)必须提供一个全局函数访问获得该实例,并且在该函数提供控制实例数量的功能,即通过if语句判断instance是否已被实例化,如果没有则可以同new()创建一个实例;否则,直接向客户返回一个实例。

  在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。因此,需对上面代码修改。

  二、多线程下的单例模式

  1、Lazy模式

public class Singleton { private static Singleton instance; private static object _lock=newobject(); private Singleton() { } public static Singleton GetInstance() { if(instance==null) {lock(_lock) { if(instance==null) { instance=new Singleton(); } } } return instance; } }

  上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。

  2、饿汉模式

  这种模式的特点是自己主动实例。

public sealed class Singleton { private static readonly Singleton instance=new Singleton();private Singleton() { } public static Singleton GetInstance() { return instance; } }

  上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

单列模式应该是sealed

转载于:https://www.cnblogs.com/zyy1688/p/10002534.html

C#设计模式学习笔记-单例模式相关推荐

  1. Header First设计模式学习笔记——单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 问题引入         有时候对于有些对象,我们只需要一个,多了反而会出现很多问题.比如:线程池,缓存,处理器偏好设置,日志 ...

  2. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  3. java/android 设计模式学习笔记(1)---单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  4. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  5. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  6. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

  7. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  8. 设计模式学习笔记(C++实现)(七)--适配器模式

    1.适配器模式简介 英文名称 Adapter 主要目的 该模式可以将一个类的的接口,转换成客户想要的另一个接口. 使用场景 1.当要使用的两个类功能相同或者相似,但仅仅是接口不同时. 2.适配器模式代 ...

  9. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

最新文章

  1. 非科班的我如何自学Python在一线城市找到一份15k的offer的?
  2. Windows Tips--How do I disable the Windows Firewall service?
  3. 5款非常好用的前端在线编辑器推荐
  4. Table-values parameter(TVP)系列之一:在T-SQL中创建和使用TVP
  5. 服务器删除网站文章,如何一次性删除wordpress所有文章
  6. 为何红黄蓝一边在被做空,一边在逆势上涨?
  7. Spring+ActiveMQ+Mysql 配置JMS
  8. c++ list 修改_ggplot2 修改图例的一些操作
  9. 前端学习(662):逻辑运算符练习
  10. 【CodeForces - 569B】Inventory (标记,乱搞)
  11. SSD之硬的不能再硬的硬核解析
  12. html风车相册代码,Css Html 大风车(示例代码)
  13. 【ES6(2015)】Reflect
  14. 数组的升序排序 字符串的方法 0308
  15. matlab 快速傅里叶变换函数(fft)编写
  16. 使用ARCGIS对shp数据添加投影坐标系
  17. OpenCV阈值分割
  18. c语言-手撕多级时间轮定时器(纯手写)
  19. java 手机推荐_Java一样也智能 中低端手机上网助手推荐
  20. python opencv批量修改图片分辨率

热门文章

  1. 中国膏剂(膏方)行业运营模式及十四五前景预测报告2022年版
  2. 菏泽合村并居促土地流转-农业大健康·万祥军:集约谋定高效
  3. Python3 文件读写
  4. 2018.3.26 1501 二叉树最大宽度和高度
  5. 原创:centos7.1下 ZooKeeper 集群安装配置+Python实战范例
  6. mysql触发器的简单写法
  7. jQuery学习笔记1--表格展开关系
  8. Python-线程的生命周期
  9. memmove函数使用时注意的问题
  10. 各国家分析之- 阿根廷与乌拉圭