设计模式之单利模式(C#语言描述,附视频下载地址)
今天来介绍所有设计模式中结构最简单的设计模式单例模式,它的核心结构中只包含一个被称为单例类的特殊类。
要想完成单例类的设计,我们要遵循一下原则即可:
1、一个类只能有一个实例
2、确保该实例对外有一个访问入口(保证我们的系统可以从这个入口拿到该类的唯一实例)
3、将单例类的构造函数私有化(private),当构造函数被私有化之后,外部无法通过new 单例类()的方法来实例化该类。既然外部无法直接实例化该类,那就要求该类的实例要自己去创建了~
下面我们先看一个最简单的单例类的实现:
/// <summary>
/// 单例类
/// </summary>
public class Singleton
{
private Singleton instance = null;
//构造函数私有化
private Singleton()
{ }
//外部通过该类的唯一入口(GetInstance方法)获得单例类的实例
public Singleton GetInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
其实上面的代码只是简单的介绍单例类的写法,下面我们来介绍一下饿汉式单例和懒汉式单例。
/// <summary>
/// 饿汉式单例类
/// </summary>
public class Singleton
{
private static Singleton instance = new Singleton();
//构造函数私有化
private Singleton()
{ }
//外部通过该类的唯一入口(GetInstance方法)获得单例类的实例
public Singleton GetInstance()
{
return instance;
}
}
饿汉式单例类在类初始化的时候,直接new了一个单例类的实例并赋值给静态私有变量,因为静态变量归类所有,所以程序自始至终只会有一个实例。
二、懒汉式单例类
上面的代码看上去很完美,并没有什么问题。但是大家可以想一个问题,在高并发大流量的情况下,如果多个应用程序对该类进行实例化时(并发调用GetInstance方法时),有可能会导致单例类创建多个实例。所以,为了解决并发创建多个实例的问题,我们可以对实例的创建过程加锁。这就衍生出来了懒汉式单例类。
/// <summary>
/// 懒汉式单例类(高并发处理)
/// </summary>
public class Singleton
{
private static Singleton instance = null;
private static readonly object syncRoot = new object();
//构造函数私有化
private Singleton()
{ }
//外部通过该类的唯一入口(GetInstance方法)获得单例类的实例
public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)//加锁之后只允许单线程访问,但是此处可能有其他的并发现成在此处等待执行
{
//因为锁外面有可能并发线程在等待执行,为了防止线程实例化类之后,后面的线程继续实例化对象,应该在加一层判断
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
视频学习下载地址:单例模式
设计模式之单利模式(C#语言描述,附视频下载地址)的更多相关文章
- 设计模式之迭代器模式——Java语言描述
迭代器模式是Java和.NET编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示 介绍 意图 提供一种方法顺序访问一个聚合对象中各个元素,无需暴露该对象的内 ...
- 设计模式之桥接模式——Java语言描述
桥接适用于把抽象化和实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构性模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦 这种模式设计到一个作为桥接的接口,使得实体类的功能独立 ...
- 设计模式之解释器模式——Java语言描述
解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在SQL解析.符号处理引擎等 介绍 意图 给定一个语言,定义它的文 ...
- 设计模式之原型模式——Java语言描述
原型模式是用于创建重复对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式 这种模式实现了一个原型接口,该接口用于创建当前对象的克隆.当直接创建对象的代价比较大时,则适 ...
- 设计模式之外观模式——Java语言描述
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.它想现有的系统添加了一个接口,以隐藏系统的复杂性 介绍 意图 为子系统中的一组接口提供了一个一致的界面,外观模式定义了一个高层接 ...
- 设计模式之组合模式——Java语言描述
组合模式又叫做部分整体模式,适用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次 介绍 意图 将对象组合成树形结构以表示"部分-整体" ...
- 设计模式之过滤器模式——Java语言描述
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...
- Win7 SP1语言包微软官方下载地址及使用方法 2
情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...
- Genymotion的安装与使用(附百度云盘下载地址,全套都有,无需注册Genymotion即可使用)
http://blog.csdn.net/scythe666/article/details/70216144 附百度云盘下载地址 :http://pan.baidu.com/s/1jHPG7h8 1 ...
随机推荐
- UVA11806 Cheerleaders (容斥)
题目链接 Solution 可以考虑到总方案即为 \(C_{nm}^k\) . 考虑到要求的是边缘都必须至少有 \(1\) ,所以考虑不合法的. 第一行和最后一行没有的方案即为 \(C_{(n-1)m ...
- 【CCF】路径解析 模拟
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- Surface机制(SurfaceFlinger服务)
Android系统Surface机制的SurfaceFlinger服务的线程模型分析http://blog.csdn.net/luoshengyang/article/details/8062945
- hdu 2104(判断互素)
hide handkerchief Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- CCCC L2-003. 月饼[贪心/类似hdu贪心老鼠]
L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...
- POJ 3254 Corn Fields [DP]
题意:略. 思路:第一次做状态压缩的dp. 在这里说一下状态压缩的原则.因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量 ...
- linux查看hostname以及修改hostname
查看hostname : hostname 修改hostname : hostnamectl set-hostname master (比如要修改为master) 修改完重启生效 : ...
- ios内存管理笔记(三)
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- 安卓Webview缓存网页数据(无网络正常显示)
热度 1已有 52 次阅读2016-8-26 17:53 |个人分类:常见问题|系统分类:移动开发 一.需求经历 最近的项目是一个原生 +webview 显示的 APP,一开始的时候,网站那边要求我们 ...
- 在红米note4上实现自动安装软件
因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装APK,但是红米会弹出继续安装的按钮,手点一次比较烦,想自动点"继续安装"按钮! 感谢先行者们的分享 本文参考 ...