C# 设计模式巩固 - 单例模式
前言
设计模式的文章很多,所以此文章只是为了巩固一下自己的基础,说的不详细请见谅。
介绍 - 单例模式
官方定义:确保一个类只有一个实例,并提供一个全局访问点。
通俗定义:就是一个类只有一个单个实例。(也没啥区别)
实现
如何保证一个类只有一个实例呢?
1. 首先一个类是如何创建实例的? - 通过构造函数
2. 如何保证只创建一个呢? - 构造函数只执行一次
3. 如何保证构造函数只执行一次呢? - 访问外部类无权访问
4. 如何让访问外部类无权访问? - 私有方法
问题解决,上代码:
/// <summary>
/// 单例类
/// </summary>
public class Singleton
{
/// <summary>
/// 私有构造函数
/// </summary>
private Singleton() { }
/// <summary>
/// 单例字段
/// </summary>
private static Singleton _instance;
/// <summary>
/// 单例对象
/// </summary>
public static Singleton Instance
{
get
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
} /// <summary>
/// 输出
/// </summary>
public void WriteLine()
{
Console.WriteLine("哈希Code : " + this.GetHashCode());
}
}
测试输出 HashCode :
class Program
{
static void Main(string[] args)
{
Singleton.Instance.WriteLine();
Singleton.Instance.WriteLine();
Singleton.Instance.WriteLine();
Console.Read();
}
}
结果:

这样就结束了吗? -(身为C#老鸟的我还要考虑下线程安全的问题,考虑并发的情况)
我们需要构建一个并发的情形及多条线程同时创建对象,下面我就用简单粗暴的方法,需要对单例进行修改:
/// <summary>
/// 单例对象
/// </summary>
public static Singleton Instance
{
get
{
if (_instance == null)
{
Thread.Sleep();
_instance = new Singleton();
}
return _instance;
}
}
调用测试:
class Program
{
static void Main(string[] args)
{
//线程1
Thread thread1 = new Thread(new ThreadStart(() =>
{
Singleton.Instance.WriteLine();
}));
//线程2
Thread thread2 = new Thread(new ThreadStart(() =>
{
Singleton.Instance.WriteLine();
}));
//线程3
Thread thread3 = new Thread(new ThreadStart(() =>
{
Singleton.Instance.WriteLine();
}));
thread1.Start();
thread2.Start();
thread3.Start();
Console.Read();
}
}
输出结果:

所以我们要对代码进行改进(加锁):
/// <summary>
/// 单例类
/// </summary>
public class Singleton
{
/// <summary>
/// 锁
/// </summary>
private static object locker = new object();
/// <summary>
/// 私有构造函数
/// </summary>
private Singleton() { }
/// <summary>
/// 单例字段
/// </summary>
private static Singleton _instance;
/// <summary>
/// 单例对象
/// </summary>
public static Singleton Instance
{
get
{
lock (locker)
{
if (_instance == null)
{
Thread.Sleep();
_instance = new Singleton();
}
}
return _instance;
}
} /// <summary>
/// 输出
/// </summary>
public void WriteLine()
{
Console.WriteLine("哈希Code : " + this.GetHashCode());
}
}
测试结果:

解决!
锁是个好东西但是要慎用,它是很耗资源的。所以还需要对代码进行改进,看代码我们知道只有 _instance 为 null 时才需要考虑并发加锁,所以我们再次改进:
/// <summary>
/// 单例类
/// </summary>
public class Singleton
{
/// <summary>
/// 锁
/// </summary>
private static object locker = new object();
/// <summary>
/// 私有构造函数
/// </summary>
private Singleton() { }
/// <summary>
/// 单例字段
/// </summary>
private static Singleton _instance;
/// <summary>
/// 单例对象
/// </summary>
public static Singleton Instance
{
get
{
if(_instance == null)
{
lock (locker)
{
if (_instance == null)
{
Thread.Sleep();
_instance = new Singleton();
}
}
}
return _instance;
}
} /// <summary>
/// 输出
/// </summary>
public void WriteLine()
{
Console.WriteLine("哈希Code : " + this.GetHashCode());
}
}
欢迎批评指正!转载请注明出处:http://www.cnblogs.com/xinwang/p/6294784.html
C# 设计模式巩固 - 单例模式的更多相关文章
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 每天一个设计模式-4 单例模式(Singleton)
每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...
- java 23 - 2 设计模式之单例模式
单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? A:把构造方法私有 B:在成员位置自己创建一个对象 C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
随机推荐
- ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat (树链剖分-线性变换线段树)
树链剖分若不会的话可自行学习一下. 前两种操作是线性变换,模\(2^{64}\)可将线段树全部用unsigned long long 保存,另其自然溢出. 而取反操作比较不能直接处理,因为其模\(2^ ...
- 什么是Java中的原子操作( atomic operations)
1.啥是java的原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行. 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么 ...
- linux在文件中包含某个关键词的指定行插入内容
1. 在包含某个关键字的行上面插入一行文字 sed -i '/wangzai/i\doubi' 1.txt 把内容doubi插入到包含wangzai关键字的上一行 2. 在包含某个关键字的行下面插入一 ...
- Cloudera Manager安装之时间服务器和时间客户端(二)
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- yum安装memchache
转载地址:http://www.cnblogs.com/jiunadianshi/articles/2001334.html 标准的CentOS5软件仓库里面是没有memcache相应的包的,所以,我 ...
- CSS Outline(轮廓)
CSS Outline(轮廓) 一.CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. CSS outline 属性规定元素轮廓 ...
- WebAPI请求——js调用
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用jQuery 来发起异步请求实现 ...
- Java线程状态流转---线程
说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...
- hello java !
我对于计算机性编程性质的课程一直没有很好的悟性,但功夫不服有心,最近自己学习视频课程,随时关注娄老师的博客,慢慢的对于java编程有了新的认识,也用eclipse软件进行了简单java的编译. 了解的 ...
- Maven错误recv failed
问题: 从SVN上检出了一个Maven项目,在执行clean命令时,出现如下错误: java.net.SocketException:Software caused connection ab ...