C#设计模式学习笔记-单例模式

简介:

    近期在学设计模式,学到创建型模式的时候。碰到单例模式(或叫单件模式),如今整理一下笔记。

  在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定义是:Ensure a class only has one instance,and provide a global point of access to。它的主要特点不是依据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个。

(《设计模式-基于C#的project化实现及扩展》。王翔)。也就是说,单例模式就是保证在整个应用程序的生命周期中,在不论什么时刻,被指定的类仅仅有一个实例,并为客户程序提供一个获取该实例的全局訪问点。

  一、经典模式:

复制代码
复制代码
 
  
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if (instance == null ) { instance = new Singleton(); } return instance; } }
复制代码
复制代码

  解析例如以下:

  1)首先,该Singleton的构造函数必须是私有的,以保证客户程序不会通过new()操作产生一个实例。达到实现单例的目的;

  2)由于静态变量的生命周期跟整个应用程序的生命周期是一样的,所以能够定义一个私有的静态全局变量instance来保存该类的唯一实例;

  3)必须提供一个全局函数訪问获得该实例。而且在该函数提供控制实例数量的功能,即通过if语句推断instance是否已被实例化,假设没有则能够同new()创建一个实例;否则。直接向客户返回一个实例。

  在这样的经典模式下,没有考虑线程并发获取实例问题,就可以能出现两个线程同一时候获取instance实例,且此时其为null时。就会出现两个线程分别创建了instance,违反了单例规则。

因此,需对上面代码改动。

  二、多线程下的单例模式

  1、Lazy模式

复制代码
复制代码
 
  
public class Singleton { private static Singleton instance; private static object _lock = new object (); private Singleton() { } public static Singleton GetInstance() { if (instance == null ) { lock (_lock) { if (instance == null ) { instance = new Singleton(); } } } return instance; } }
复制代码
复制代码

  上述代码使用了双重锁方式较好地攻克了多线程下的单例模式实现。

先看内层的if语句块,使用这个语句块时。先进行加锁操作。保证仅仅有一个线程能够訪问该语句块,进而保证仅仅创建了一个实例。

再看外层的if语句块,这使得每一个线程欲获取实例时不必每次都得加锁,由于仅仅有实例为空时(即须要创建一个实例)。才需加锁创建,若果已存在一个实例。就直接返回该实例,节省了性能开销。

  2、饿汉模式

  这样的模式的特点是自动实例。

复制代码
复制代码
 
  
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; } }
复制代码
复制代码
上面使用的readonly关键能够跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并能够在执行时编译。在这样的模式下。无需自己解决线程安全性问题,CLR会给我们解决。由此能够看到这个类被载入时。会自己主动实例化这个类。而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5205189.html,如需转载请自行联系原作者
相关文章
|
1月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
61 0
|
1月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
23 0
|
3月前
|
设计模式 安全 Java
设计模式-单例模式
设计模式-单例模式
38 0
|
1月前
|
设计模式 安全 Java
设计模式之单例模式
设计模式之单例模式
|
12天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1
|
1月前
|
设计模式 存储 缓存
设计模式之单例模式(C++)
设计模式之单例模式(C++)
22 2
|
1月前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
66 9
Java设计模式之单例模式
|
2月前
|
设计模式 存储 安全
【设计模式】创建型模式之单例模式(Golang实现)
【2月更文挑战第3天】一个类只允许创建一个对象或实例,而且自行实例化并向整个系统提供该实例,这个类就是一个单例类,它提供全局访问的方法。这种设计模式叫单例设计模式,简称单例模式。
34 1
|
3月前
|
设计模式 安全 Java
【设计模式】单例模式
【1月更文挑战第27天】【设计模式】单例模式
|
3月前
|
设计模式 安全 Java
Java设计模式—单例模式的实现方式和使用场景
那么为什么要有单例模式呢?这是因为有的对象的创建和销毁开销比较大,比如数据库的连接对象。所以我们就可以使用单例模式来对这些对象进行复用,从而避免频繁创建对象而造成大量的资源开销。
58 1