概述

单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。


意图

保证一个类仅有一个实例,并提供一个该实例的全局访问点。


场景

  1. Windows的Task Manager(任务管理器)就是很典型的单例模式,任何时候只能打开一个窗口。
  2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
  4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
  6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
  7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
  8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
  9. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.

实现

1.将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

2.在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

饿汉式

  • 静态常量(经典写法)
public class Singleton
{
private static Singleton _instance = new Singleton();
private Singleton() { } public static Singleton Instance()
{
return _instance;
}
}

适用:单/多线程

模式:饿汉式(静态常量)[可用]

优点:写法比较简单,避免了线程同步问题

缺点:没能实现延迟加载

  • 静态代码块
public class Singleton2
{
private static Singleton2 _instance; static Singleton2()
{
_instance = new Singleton2();
} private Singleton2(){} public Singleton2 Instance()
{
return _instance;
}
}

适用:单/多线程

模式:饿汉式(静态代码块)[可用]

优点:写法比较简单,避免了线程同步问题

缺点:没能实现延迟加载

懒汉式

  • 线程不安全
public class Singleton3
{
private static Singleton3 _instance; private Singleton3() { } public static Singleton3 Instance()
{
return _instance ?? (_instance = new Singleton3());
}
}

适用:单线程

模式:懒汉式(线程不安全)[不可用]

优点:适用于单线程,实现简单,延迟加载

缺点:多线程不安全,违背了单列模式的原则

  • 线程不安全
public class Singleton4
{
private static Singleton4 _instance;
private static readonly object SyncObject = new object(); private Singleton4() { } public static Singleton4 Instance()
{
lock (SyncObject)
{
if (_instance == null)
{
_instance = new Singleton4();
}
}
return _instance;
}
}

适用:单线程

模式:懒汉式(线程安全)[不推荐]

优点:线程安全;延迟加载;

缺点:这种实现方式增加了额外的开销,损失了性能(当有多个调用时,第一个调用的会进入lock,而其他的则等待第一个结束后才能调用,后面的依次访问、等待……)

  • 双重检查锁定
public class Singleton5
{
private static Singleton5 _instance;
private static readonly object SyncObject = new object(); private Singleton5() { } public static Singleton5 Instance()
{
if (_instance==null)
{
lock (SyncObject)
{
if (_instance == null)
{
_instance = new Singleton5();
}
}
}
return _instance;
}
}

适用:单/多线程

模式:双重检查锁定(Double-Check Locking)(线程安全)[推荐]

优点:线程安全;延迟加载;效率较高(只会实例化一次,首先会判断是否实例化过,如果实例化了,直接返回实例,不需要进入lock;如果未实例化,进入lock,就算是多个调用也无妨,第一次调用的会实例化,第二个进入lock时会再次判断是否实例化,这样线程就不会阻塞了。)

缺点:基本没有

  • 静态内部类
public class Singleton6
{
private Singleton6() { } private static class SingletonInstance
{
public static Singleton6 Instance = new Singleton6();
} public static Singleton6 Instance()
{
return SingletonInstance.Instance;
}
}

适用:单/多线程

模式:静态内部类(线程安全)[推荐]

优点:避免了线程不安全;延迟加载;效率高(这种方式跟饿汉式方式采用的机制类似:都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方是:饿汉式只要Singleton类被装载就会实例化,没有Lazy-Loading的作用;而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用Instance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。)

缺点:基本没有

.NET设计模式(1):1.1 单例模式(Singleton Pattern)的更多相关文章

  1. 深入设计模式(二)——单例模式(Singleton Pattern)

    一.单例模式介绍 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它 ...

  2. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  3. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  4. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  5. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  6. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  7. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  8. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  9. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

随机推荐

  1. FMX保存JPG格式的Stream

    刚刚看以前的笔记,估计这个用的人很少 var surf:TBitmapSurface; astream:TmemoryStream; begin surf:=TbitmapSurface.Create ...

  2. perl 删除过期文件

    #!/usr/bin/perl `find /bak/ >list.txt`; open LIST,"/root/list.txt"; while (<LIST> ...

  3. 大家一起Aop

    一.前言 1.在项目中无处不充斥着记录日志的代码,各种try catch,实在是有点看着不爽.这不,果断要想法子偷个懒儿. 二.摘要 鄙人不才,先总结一下个人想到的可实现AOP的几种思路: 1.通过继 ...

  4. Linux+Mono+WebService:CS1703: An assembly with the same identity--mscorlib

    最近把一些东西开始往Linux迁移了,因为老系统大部分都是.NET,所以直接使用Mono,代码一般都使用MonoDevelop把代码重新编译,把一些WMI和windows DLL调用改Linux的os ...

  5. ASP.NET安全

    ASP.NET 安全 概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 ...

  6. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

  7. 用Powershell启用Windows Azure上的远程桌面服务

    [题外话] 某天不小心点了XX管家的自动修复,虽然及时点了取消也看到了远程桌面服务成功被关闭,但是忙完该干的事以后竟然忘记了这件事,在断开远程桌面服务之前也忘记再次打开.以至于之后几天一直以为Azur ...

  8. 飞鱼(FlyFish)——便捷的原型在线制作工具

    关于项目原型制作,小菜先前写过一篇文章<FastUI快速界面原型制作工具>,只不过那个是用C#写的原型制作工具,但是感觉用C#写起来比较费力,而且也不太好用,经过高人指点,茅塞顿开,决定重 ...

  9. 干货!表达式树解析"框架"(2)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 为了过个好年,我还是赶快把这篇完成了吧 声明 本文内容需要有一定 ...

  10. Worktile协同特色之二:任务看板管理

    什么是看板 看板是一种使用可视化管理的方式,跟踪任务在整个价值流中流经的不同阶段,通常我们会用带贴纸的白板,或是电子卡片墙.具备如下几个特征:1. 流程可视化 把工作拆分成小块,一张卡片写一件任务,再 ...