C#单例模式的多种写法

它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个。(《设计模式-基于C#的工程化实现及扩展》,王翔)。也就是说,单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

第一种最简单,但没有考虑线程安全,在多线程时可能会出问题.

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,违反了单例规则。因此,需对上面代码修改。

第二种为多线程下的单例模式,考虑了线程安全

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语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。

第三种饿汉模式

这种模式的特点是自己主动实例。

public sealed class Singleton
{
        private static readonly Singleton instance=new Singleton();

        private Singleton()
        {
        }

        public static Singleton GetInstance()
        {
               return instance;
        }
}

上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

时间: 2024-12-21 12:56:15

C#单例模式的多种写法的相关文章

单例模式的多种写法

public class Singleton { private Singleton(){}//私有化构造器 private static Singleton instance = null; //类的内部创建对象 public static Singleton getInstance(){ //暴露公共的get方法 if(instance == null){ instance = new Singleton(); } return instance; } } //饿汉 class Single

单例模式,多种实现方式JAVA

转载请注明出处:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } retu

单例模式几种写法

第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显,但是致命的是在多线程

单例模式的多种实现

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.当一个类的实例有且只可以有一个的时候就需要用到单例模式了.为什么只需要有一个呢?有人说是为了节约内存,但这只是单例模式带来的一个好处.只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由.我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候.比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢? Singleton模式主要作用是保证

单例模式及常见写法分析(设计模式01)

保证一个类仅有一个实例,并提供一个该实例的全局访问点. --<设计模式> 单例模式的概念很简单,下面以C#语言为例子,列出常见单例写法的优缺点. 1.简单实现 public sealed class Singleton { static Singleton instance = null; public void Show() { Console.WriteLine( "instance function"); } private Singleton() { } publi

【WebFrontEnd】布局的多种写法

第一次写文章,巧紧张!!! 这是一个很简单的布局,不过是个值得深思的问题.对于这种布局,可以有多种HTML.CSS写法,那么到底可以有多少种写法呢? 我的思路是根据HTML的不同布局,写不同的CSS.这里为了效果,所以都给元素添加了固定的高度. 1.第一种HTML布局 1-1.第一种CSS布局: 这种写法是一个清除了浮动的父元素含有两个向左浮动的子元素,子元素各设置了宽度. 这种写法的缺点是不够灵活,父元素和子元素还有边距都是固定写死的, 如果父元素container宽度改变,aside宽度不变

单例模式的多种实现及优缺点比较

Head First一书中对单例模式的定义是:单例模式确保一个类只有一个实例,并提供一个全局访问点. 在很多实际场景应用中,我们希望某个类只能有一个实例化的对象,例如数据连接池,日志对象等等,这个时候我们就要使用单例模式了,单例模式的核心思想是私有化构造器,防止其他类任意实例化该类,具体的实现有多种,每种都会有其优缺点,让我们来仔细看看各种实现的差异吧. 依据我写代码的习惯,先上UML类图,我用的工具是StarUML,免费不需要破解哦:) 第一种实现: public class MyClass

Objective-c单例模式的正确写法--用dispatch 线程安全

单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考这篇文章. 单例顾名思义就是说一个类的实例只能有一个,在java.C++这类语言中,可以通过将构造函数私有化来避免对象的重复创建,但是objective-c却不能够这样做,我们需要通过其他机制来达到这个目的.一般情况下,可能我们写的单例模式是这样的: #import @interface Singl

模式--单例模式8种写法

单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式.但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧. 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在. 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象