设计模式之单利模式(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 ...
随机推荐
- php函数总结
1. isset($var) 变量存在且不为NULL,则返回TRUE 变量不存在或为NULL,则返回FALSE 2. empty($var) 若变量不存在或变量值为"".0.&qu ...
- 【一个比较bug free的二分写法】
lower_bound: [l, r)区间内大于等于val的第一个位置 int lower_bound(int l, int r, int val){ while(l < r){ ); if(a ...
- Mongodb学习(1)--- mongoose: Schema, Model, Entity
Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model : 由 Schema 发布生成的模型,具有抽象属性和行为的数据库操作 Entity : 由 Model 创建的 ...
- VMWare VMNet 8 的配置使用
网上有很多讲解VMWare网络原理的文章,我在这里就不在赘述,有兴趣的朋友可以自己搜 本章主要介绍下我们使用VM最常用的两种网络模式,VMNet 0 和 VMNet 8 本文均为原创,如需转载请标明, ...
- How Many to Be Happy?
How Many to Be Happy? 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Let G be a connected simple undirected graph wh ...
- nvarchar与varchar的区别
原文发布时间为:2009-08-05 -- 来源于本人的百度文章 [由搬家工具导入] 1、通俗一點就是varchar適合輸入英文和數字,nvarchar一般用做中文或其它語言的輸入,這樣到別的語系不會 ...
- transform与position:fixed的那些恩怨
1. 前言 在写这篇文章之前,我理解的fixed元素是这样的:(摘自CSS布局基础) 固定定位与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身.由于视图本身是固定的, ...
- duilib入门简明教程 -- XML基础类(7) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3343743.html 现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍. 前面的教程我们写了很多代码,为的是 ...
- bjam.exe 各个参数(转)
原文转自 http://m.blog.csdn.net/article/details?id=42265605 bjam.exe stage --toolset=msvc-12.0 --without ...
- Day 23 异常处理
异常处理 一.异常基本形式 # if # def test: # pass # class Foo # pass def test(): ''' 异常的基本类型和相关 :return: ''' try ...