空间站 参考消息,国内做网站上市公司,免扣连线矢量图,新媒体运营怎么自学C#设计模式学习笔记-单例模式 最近在学设计模式#xff0c;学到创建型模式的时候#xff0c;碰到单例模式#xff08;或叫单件模式#xff09;#xff0c;现在整理一下笔记。 在《Design Patterns#xff1a;Elements of Resuable Object-Oriented Software》中的定义是学到创建型模式的时候碰到单例模式或叫单件模式现在整理一下笔记。 在《Design PatternsElements of Resuable Object-Oriented Software》中的定义是Ensure a class only has one instanceand provide a global point of access to。它的主要特点不是根据客户程序调用生成一个新的实例而是控制某个类型的实例数量-唯一一个。《设计模式-基于C#的工程化实现及扩展》王翔。也就是说单例模式就是保证在整个应用程序的生命周期中在任何时刻被指定的类只有一个实例并为客户程序提供一个获取该实例的全局访问点。 一、经典模式 public class Singleton{ private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if(instancenull) { instancenew 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 _locknew object(); private Singleton() { } public static Singleton GetInstance() { if(instancenull) { lock(_lock) { if(instancenull) { instancenew Singleton(); } } } return instance; }} 上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块使用这个语句块时先进行加锁操作保证只有一个线程可以访问该语句块进而保证只创建了一个实例。再看外层的if语句块这使得每个线程欲获取实例时不必每次都得加锁因为只有实例为空时即需要创建一个实例才需加锁创建若果已存在一个实例就直接返回该实例节省了性能开销。 2、饿汉模式 这种模式的特点是自己主动实例。 public sealed class Singleton{ private static readonly Singleton instancenew Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; }} 上面使用的readonly关键可以跟static一起使用用于指定该常量是类别级的它的初始化交由静态构造函数实现并可以在运行时编译。在这种模式下无需自己解决线程安全性问题CLR会给我们解决。由此可以看到这个类被加载时会自动实例化这个类而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html转载于:https://www.cnblogs.com/chengjun/p/4955867.html