C#设计模式学习笔记-单例模式

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

  在《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 static Singleton 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=new object();

       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()后才实例化出唯一的单例对象。

转载于:https://www.cnblogs.com/lc-ant/p/3985864.html

C# 单例模式(转)相关推荐

  1. Java单例模式个人总结(实例变量和类变量)

    Java单例模式 背景知识:Static关键字. 在对于定义类的变量,分为两种,是否具有static修饰的变量: 没有static修饰的变量,通过类的实例化(对象)引用,改变量称为实例变量: 使用st ...

  2. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

  3. Java设计模式:单例模式

    学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例  , 保证一个类 ...

  4. [Python设计模式] 第21章 计划生育——单例模式

    github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...

  5. Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、

    1. 字典根据键从小到大排序? In[38]: dic = {"name": "Tom", "age": 30, "country ...

  6. 单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)...

    首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked lockin ...

  7. 基础设计模式:单例模式+工厂模式+注册树模式

    单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景: 一般数据库实例都会用单例模式 实现: 单例设计模式就是要一个类只能实例化一个对象. 要想让一个类只能实 ...

  8. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.--DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  9. 设计模式 之美 -- 单例模式

    为什么要使用单例? 一个类只允许创建一个对象或者实例. 背景简介:使用多线程并发访问同一个类,为了保证类的线程安全,可以有两种方法: 将该类定义为单例模式,即该类仅允许创建一个实例 为该类的成员函数添 ...

  10. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

最新文章

  1. epoll相关资料整理
  2. Python抓取网页数据的终极办法
  3. Xftp5解决“要继续使用此程序,您必须应用最新的更新或使用新版本”
  4. 一个按键控制数码管的开和关_一个按键控制一个数码管
  5. 伙伴分配器的一个极简实现
  6. 深圳 | 鹏程实验室研究员招收访问学生
  7. DedeCMS总是提示验证码不正确的解决方法
  8. 1260.shift-2d-grid
  9. 哪些人适合转行学习IT技术
  10. 网络流24题 最小路径覆盖(DCOJ8002)
  11. gclient 设置代理问题
  12. 【Java】【Lambda】东京奥运奖牌排序
  13. [读后感] 书名:追风筝的人
  14. 使用脚本,直接修改注册表的值---设置win10背景色(保护色)
  15. 被骗子骗时反把骗子骗!
  16. 软件度量不是猫抓老鼠的游戏
  17. 西门子PLC OPC配置及开发
  18. 1688/阿里巴巴/拼多多API接口信息大全
  19. Jenkins构建项目时报错“message“:“Error processing tar file(exit status 1): write/xxx/no space left on device
  20. 用计算机算方程近似值,借助CASIO图形计算器探索方程近似解的求解

热门文章

  1. oracle 11.2.0.4 make 报错,linux7安装oracle11.2.0.4RAC注意事项
  2. java二叉树递归算法_Java二叉树的四种遍历(递归和非递归)
  3. ip地址怎么设置才有效_房产遗嘱怎么写才有效?需要公证吗?
  4. linux编程创建文件,快速创建linux文件
  5. python 二分查找法
  6. Android中Context的详细介绍
  7. submit 读取mb52数据
  8. 列出场景对象Lightmap属性
  9. Android音频系统之AudioFlinger(一)
  10. 华为击败思科 赢得阿曼2600万美元NGN合同