对C#单例模式的理解
2018年11月6日 小雨
一、单例模式的定义
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例,是一种对象创建型模式,有如下3个要点:
- 只能有一个实例
- 必须是自行创建这个实例
- 必须自行向整个系统提供这个实例
二、单例模式的结构
- 一个类型为自身的静态私有成员变量 - 存储唯一实例
- 一个私有的构造函数
- 一个公有的静态成员方法 ,返回唯一实例,对象为自身
class SingletonClass
{
private static SingletonClass _instance = null; //静态私有成员变量,存储唯一实例 private SingletonClass() //私有构造函数,保证唯一性
{
} public static SingletonClass GetInstance() //公有静态方法,返回一个唯一的实例
{
if (_instance == null)
{
_instance = new SingletonClass();
}
return _instance;
}
}
三、单例模式的两种书写方法
1.类被加载时就将自己实例化
class SingletonClass
{
private static SingletonClass _instance = new SingletonClass(); private SingletonClass()
{
} public static SingletonClass GetInstance()
{
return _instance;
}
}
2.类在第一次被引用时将自己实例化
class SingletonClass
{
private static SingletonClass _instance = null;
private static readonly object syncRoot = new object(); private SingletonClass()
{
} public static SingletonClass GetInstance()
{
if (_instance == null)
{
lock (syncRoot)
{
if (_instance == null)
{
_instance = new SingletonClass();
}
}
}
return _instance;
}
}
四、双重锁的运用分析
在上述代码中出现“If - Lock - If”结构模式,即双重检查锁定的双重判断机制:
if (_instance == null) //第一重判断,先判断实例是否存在,不存在再加锁处理
{
lock (syncRoot) //加锁,在某一时刻只允许一个线程访问
{
if (_instance == null) //第二重判断: 第一个线程进入Lock中执行创建代码,第二个线程处于排队等待状态,当第二个线程进入Lock后并不知道实例已创建,将会继续创建新的实例
{
_instance = new SingletonClass();
}
}
}
五、单例模式的优缺点
- 封装了唯一性,可严格控制客户怎么访问及何时访问
- 内存中只存在一个对象,可节约系统资源,提高系统性能
- 单例类的扩展不方便
- 单例类既提供了业务方法,又提供了创建对象的方法,将对象的创建和对象本身的功能耦合在一起
六、适用环境
系统只需要一个实例对象,客户调用类的单个实例只允许使用一个公共访问点,除了公共访问点,不能通过其他途径访问该实例
对C#单例模式的理解的更多相关文章
- javascript单例模式的理解
javascript单例模式的理解 阅读目录 理解单例模式 使用代理实现单例模式 理解惰性单例 编写通用的惰性单例 单例模式使用场景 回到顶部 理解单例模式 单例模式的含义是: 保证一个类只有一个实例 ...
- JAVA Static方法与单例模式的理解
近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正. 为此,我细致想了想,发现还是非常有道理的.这里谈谈我个人对s ...
- JAVA设计模式 1 设计模式介绍、单例模式的理解与使用
数据结构我们已经学了一部分了.是该了解了解设计模式了.习惯了CRUD的你,也该了解了解这一门神器.我为啥要说是神器呢? 因为在大厂的面试环节.以及很多的比如 Springboot Mybatis 等开 ...
- 单例模式的理解【php】
单例模式(Singleton Pattern):顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 为什么要使用单例模式 1.P ...
- python中对单例模式的理解
class Foo(object): instance = None def __init__(self): pass def process(self): ' @classmethod #版本1单例 ...
- 深入理解JavaScript系列
转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...
- 大熊君说说JS与设计模式之------单例模式Singleton()
一,总体概要 1,笔者浅谈 顾名思义单例模式并不难理解,是产生一个类的唯一实例,在我们实际开发中也会使用到这种模式,它属于创建模式的一种,基于JS语言本身的语法特征, 对象直接量“{}”,也可以作为单 ...
- iOS设计模式之单例模式
单例模式 基础理解 所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效. 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全 ...
- 深入理解JavaScript系列(转自汤姆大叔)
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
随机推荐
- vue自学入门-5(vuex state)
vue自学入门-1(Windows下搭建vue环境) vue自学入门-2(vue创建项目) vue自学入门-3(vue第一个例子) vue自学入门-4(vue slot) vue自学入门-5(vuex ...
- springboot~工作流activiti的搭建
概念 工作流产品使用activiti的算是比较多了,自带了一套UI界面,可以直接使用,用来设计流程,下面简单总结一下它的步骤: 1 设计模型 2 发布为流程,一个模型可以发布多个版本的流程 3 建立一 ...
- java学习笔记之IO编程—File文件操作类
1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ...
- create_function()代码注入
00x00create_function()函数的简介 适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 功能:根据传递的参数创建匿名函数,并为其返回唯一名称. 语法: creat ...
- 在线教育厮杀惨烈,51Talk一家独大之后,却仍是持续亏损?
编辑 | 于斌 出品 | 于见(mpyujian) 来自51Talk在线少儿英语专业的学生陈和涛已经成为最近<快乐营大本营>的一个亮点.该学生应邀以流利的英语在台上作自我介绍,并与51Ta ...
- 添加一个layer
let testLayer = new TestLayer1();this.addChild(testLayer); let TestLayer1 = cc.Layer.extend({ ctor:f ...
- hdu 5917
题意:给你一个无向图,问图中有多少个符合条件的集合?条件为这个集合里面存在一个子集(大小>=3)为团或者都是孤立点.答案mod1e9+7: 根据 Ramsey定理,大于等于6个的集合,肯定存在一 ...
- 微信小程序 selectComponent 值为null
这个东西的执行时间感觉有点迷, 我遇到的情况是在page 的onReady onShow 当中 使用 selectComponent 无法获取到子组件的对象 只好退而求其次 在需要触发的方法当中 ...
- 【网站】i新媒上线了!
[New]i新媒上线了! i新媒,是新媒体人常用和必备的工具导航,我们整合了自媒体平台.行业资讯.运营营销.学习创业等常用的网站,让新媒体人更快地获取有用的知识. 访问链接:https://ixm.h ...
- 【转载】Hive vs HBase
转自:http://www.chinastor.com/a/hbase/0G3Z532014.html Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据 ...