C#设计模式-单例模式
为什么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#设计模式-单例模式相关推荐
- Python设计模式-单例模式
Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...
- Android设计模式——单例模式(Singleton)
二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...
- 【学习笔记】ABAP OOD设计模式 - 单例模式
ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...
- Go 语言实现 23 种设计模式 单例模式
Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...
- java singleton inner class_Java面向对象设计模式-单例模式
Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...
- Java开发中常用的设计模式-单例模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...
- 炒冷饭系列:设计模式 单例模式
2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...
- 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
- 小视频源码,设计模式单例模式
小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...
最新文章
- .Net Micro Framework研究—TCP/IP通信
- 坚持,这两个字非常重要!
- 手机闪存速度排行_一举夺魁2.0!魅族17 Pro荣获盖得排行第一名
- s5pv210开发板、原理图、刷机和数据手册
- 关于ASPNET_Membership用户被锁的解决
- 卫星轨道的估计问题(Matlab)(三):标准重采样粒子滤波(SIR)对新问题的尝试
- struts1(一)流程分析
- R语言 MCMC算法及其实现
- 删除 srvinstw安装的服务
- 如何通过XRD计算晶格常数
- 虚幻引擎4崩溃?10个UE4崩溃解决方法来了
- oracle 同义词public,oracle中private同义词跟public同义词
- 《2022爱分析·银行数字化厂商全景报告》发布,菊风连续入选「视频银行」优质代表厂商
- Android UI 之WaterFall瀑布流效果
- 安装elasticsearch
- NUL与NULL的区别
- 高等数学(第七版)同济大学 总习题九(后10题) 个人解答
- NIB 和 XIB 的区别
- 【第3期】量化大咖来了!揭开量化对冲的神秘面纱
- php如何设置伪静制,如何设置伪静态?