第1章 单例模式(Single Pattern)

原文 第1章 单例模式(Single Pattern)

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

 一、常用模式:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Singleton

{

        private static Singleton instance;

  

        private Singleton()

        {

          

        }

  

        public static Singleton GetInstance()

        {

                if(instance==null)

                {

                        instance=new Singleton();

                }

                return instance;

        }

}

这种模式只适用在单线程下,并没有考虑到线程并发的问题,在多线程中,可能出现两个线程同时获取Instance的实例,可能会出现多个实例对象。

二、多线程下Lazy模式:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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;

       }

}

使用了Lock锁,可以较好的解决多线程下单例模式的实现,lock锁保证同一时间内只有一个线程能访问Lock里面的语句块,比较有效的解决性能的开销。

三、饿汉模式


1

2

3

4

5

6

7

8

9

10

11

12

13

public sealed class Singleton

{

        private static readonly Singleton instance=new Singleton();

   

        private Singleton()

        {

        }

  

        public static Singleton GetInstance()

        {

               return instance;

        }

}

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

四、延迟加载


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public sealed class Singleton

 {

    Singleton()

     {

     }

   

     public static Singleton Instance

     {

         get

        {

            return Nested.instance;

        }

    }

      

    class Nested

    {

        static Nested()

        {

        }

  

        internal static readonly Singleton instance = new Singleton();

    }

}

这种方法用的比较的少,但是也是一种不错的方法。

 

   设计模式系列文章入口http://www.diyibk.com/post/39.html

时间: 2024-09-24 20:41:34

第1章 单例模式(Single Pattern)的相关文章

解读设计模式----单例模式(Singleton Pattern)

单例模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计中,有很多情况需要确保一个类只能有一个实例.从这句话可以看出,Singleton模式的核心:如何控制用户使用new对一个类的实例构造器的任意调用.如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?这应该是类设计者的责任,而不是使用者的责任. 一.单例模式意图 保证一个类有且只有一个实例,并提供一个访问它的全局访问点. 二.单例模式UML图(该图来至http://www.dofactory.com/) 三.示

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

一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它. 二.解决的问题(What To Solve) 当一个类只允许创建一个实例时,可以考虑使用单例模式. 三.单例模式分析(Analysis)1.单例模式结构 Singleton类,定义一个私有变量instance;私有构造方法Singleton(

.Net 单例模式(Singleton)

单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类   每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情 况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述:         单例模式 Si

《设计模式》学习笔记5——单例模式【高并发拓展】

定义 单例模式又称为单件模式,这个模式大概是设计模式中最好理解的了,我起初就打算从这里开始学,甚至还记过另一篇单例模式学习的笔记. 但是之后跟着<设计模式>这本书系统的学,就索性从第一页开始,而单例模式算是复习,也算是再深入的理解一次. 之所以要这么做,是因为上一次写的没有给出更标准的定义,同时,当时只介绍了基础的懒汉式和饿汉式,对于并发时候的单例却没有涉及,所以这篇学习的重点应当在于高并发时如何保证我们的单例依旧是单例. 单例模式引用书中的定义如下: 单例模式(Singleton Patte

.Net 单例模式(Singleton)_实用技巧

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述:         单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个

《研磨设计模式》试读样章 第五章

<!-- --> 第5章  单例模式(Singleton)  5.1  场 景 问 题 5.1.1  读取配置文件的内容 考虑这样一个应用,读取配置文件的内容. 很多应用项目,都有与应用相关的配置文件,这些配置文件很多是由项目开发人员自定义的,在里面定义一些应用需要的参数数据.当然在实际的项目中,这种配置文件多采用xml格式,也有采用properties格式的,毕竟使用Java来读取properties格式的配置文件比较简单. 现在要读取配置文件的内容,该如何实现呢? 5.1.2  不用模式的

《研磨设计模式》试读样章

第1章  设计模式基础 1.1  设计模式是什么 1.1.1  什么是模式      从字面上来看,模,就是模型.模板的意思:式,就是方式.方法的意思.综合起来,所谓模式就是:可以作为模型或模板的方式或方法.再简单点说就是可以作为样板的方式或方法,类似于大家所熟悉的范例. 1.1.2  设计模式的概念 按照上面的理解,设计模式指的就是设计方面的模板,也即设计方面的方式或方法. 1.设计模式是解决方案 根据上面对设计模式的定义可以看出,归根结底,设计模式就是一些解决方案. 所谓解决方案,就是解决办

23种设计模式大全(适合新手阅读)

原文:23种设计模式大全(适合新手阅读) 第Ⅰ部分 开篇     序章 第Ⅱ部分 创建型模式篇     第1章 单例模式(Single Pattern)     第2章 简单工厂模式(Sample Factory)     第3章 抽象工厂模式(Abstract Factory)     第4章 建造者模式(Builder Pattern)     第5章 原型模式(Protype Pattern) 第Ⅲ部分 结构型模式篇     第6章 适配器模式(Adapter Pattern)     第

.NET设计模式系列文章

目录计划: 第Ⅰ部分 开篇 开篇 第Ⅱ部分 创建型模式篇 第1章 单件模式(Single Pattern) 第2章 抽象工厂模式(Abstract Factory) 第3章 建造者模式(Builder Pattern) 第4章 工厂方法(Factory Method) 第5章 原型模式(Protype Pattern) 第6章 创建型模式专题总结 第Ⅲ部分 结构型模式篇 第7章 适配器模式(Adapter Pattern) 第8章 桥接模式(Bridge Pattern) 第9章 装饰模式(De