为什么80%的码农都做不了架构师?>>>   

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

  在《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://my.oschina.net/ind/blog/379823

C#设计模式-单例模式相关推荐

  1. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  2. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  3. 【学习笔记】ABAP OOD设计模式 - 单例模式

    ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...

  4. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  5. java singleton inner class_Java面向对象设计模式-单例模式

    Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...

  6. Java开发中常用的设计模式-单例模式

    单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...

  7. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  8. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  9. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  10. 小视频源码,设计模式单例模式

    小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...

最新文章

  1. .Net Micro Framework研究—TCP/IP通信
  2. 坚持,这两个字非常重要!
  3. 手机闪存速度排行_一举夺魁2.0!魅族17 Pro荣获盖得排行第一名
  4. s5pv210开发板、原理图、刷机和数据手册
  5. 关于ASPNET_Membership用户被锁的解决
  6. 卫星轨道的估计问题(Matlab)(三):标准重采样粒子滤波(SIR)对新问题的尝试
  7. struts1(一)流程分析
  8. R语言 MCMC算法及其实现
  9. 删除 srvinstw安装的服务
  10. 如何通过XRD计算晶格常数
  11. 虚幻引擎4崩溃?10个UE4崩溃解决方法来了
  12. oracle 同义词public,oracle中private同义词跟public同义词
  13. 《2022爱分析·银行数字化厂商全景报告》发布,菊风连续入选「视频银行」优质代表厂商
  14. Android UI 之WaterFall瀑布流效果
  15. 安装elasticsearch
  16. NUL与NULL的区别
  17. 高等数学(第七版)同济大学 总习题九(后10题) 个人解答
  18. NIB 和 XIB 的区别
  19. 【第3期】量化大咖来了!揭开量化对冲的神秘面纱
  20. php如何设置伪静制,如何设置伪静态?

热门文章

  1. 如今前端程序员还有前途吗?
  2. AI圣经《深度学习》作者斩获2018年图灵奖,100 万奖励!
  3. 英特尔发布CPU新架构,突破性采用3D堆栈法
  4. 以对象的方式来访问xml数据表(二)
  5. SharePoint2013的头像显示和读取
  6. ASP.NET MVC资源文件多语言实现方式
  7. 程序员面试金典——2.3访问单个结点的删除
  8. 剑指offer——面试题42-1:左旋转字符串
  9. Leetcode 374.猜数字大小
  10. convLSTM-tensorflow:LSTM理解