四、单件模式

单件模式:某一个类只有一个实例,并且这个实例是在类内部进行实例化,并向整个系统提供该实例。

单件模式UML类图:

    class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetSington();
            Singleton s2 = Singleton.GetSington();
            if (s1 == s2)
            {
                Console.WriteLine("相同");
            }
            else
            {
                Console.WriteLine("不相同");
            }
            Console.ReadKey();
        }
    }

    public sealed class Singleton
    {
        private static Singleton _Singleton = null;

        private Singleton()
        {

        }

        public static Singleton GetSington()
        {
            if (_Singleton == null)
            {
                _Singleton = new Singleton();
            }
            return _Singleton;
        }
    }

示例说明:

示例中使用Singleton类的GetSington()方法对单例进行处理,如果私有对象_Singleton为空则调用私有构造函数创建对象,如果私有对象不为空则返回直接返回_Singleton实例。

通过GetSington()方法保证获取对象实例时返回的是同一个实例,通过使用私有构造函数保证了对象不会被外部调用创建实例。

单件模式的另一种实现形式

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

这使得代码减少了许多,同时也解决了线程问题带来的性能上损失。那么它又是怎样工作的呢?
注意到,Singleton 类被声明为 sealed,以此保证它自己不会被继承,其次没有了 Instance 的方法,将原来_instance成员变量变成 public readonly,并在声明时被初始化。通过这些改 变,我们确实得到了 Singleton 的模式,原因是在 JIT 的处理过程中,如果类中的 static 属性 被任何方法使用时,.NET Framework 将对这个属性进行初始化,于是在初始化 Instance 属 性的同时 Singleton 类实例得以创建和装载。而私有的构造函数和readonly(只读)保证了 Singleton 不会被再次实例化,这正是 Singleton 设计模式的意图。 (摘自:http://www.cnblogs.com/huqingyu/archive/2004/07/09/22721.aspx
不过这也带来了一些问题,比如无法继承,实例在程序一运行就被初始化,无法实现延迟初始化

多线程中单例模式

    class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetSington();
            Singleton s2 = Singleton.GetSington();
            if (s1 == s2)
            {
                Console.WriteLine("相同");
            }
            else
            {
                Console.WriteLine("不相同");
            }
            Console.ReadKey();
        }
    }

    public sealed class Singleton
    {
        private static Singleton _Singleton = null;
        private static object obj = new object();
        private Singleton()
        {

        }

        public static Singleton GetSington()
        {
            if (_Singleton == null)
            {
                lock (obj)
                {
                    if (_Singleton == null)
                    {
                        _Singleton = new Singleton();
                    }
                }

            }
            return _Singleton;
        }
    }

 Singleton模式优点
1)  对唯一实例的受控访问, 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
2)  缩小名空间,Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
3)  允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4)  允许可变数目的实例 这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问 Singleton实例的操作需要改变。

时间: 2024-12-15 07:51:40

四、单件模式的相关文章

设计模式学习笔记(十四:单件模式)

1.1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点.这就是单件模式的定义. 在某些情况下,我们可能需要某个类只能创建一个对象,即不让用户用该类实例化出多于两个的实例. 例如,在一个公文管理系统中,公文类的实例"公文文件",需要将公章类的实例作为自己的一个成员,以表明自己是一个有效的公文文件,那么系统的设计者就需要保证公章类只有一个实例,不能允许用户使用公章类的构造方法再创建出第2个实例. 单件模式是关于怎样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将类的构

【C#设计模式】01.你真的知道线程安全的“单件模式”吗?

概述: 单件模式的类图可以说是所有模式的类图中最简单的,事实上,它的类图上只有一个类. 尽管从设计的视角来说它很简单,但是实现上还是会遇到相当多的波折. 一.职责: 1.保证一个类有且仅有一个实例 2.且提供一个全局访问点 二.代码中需要用到的地方 线程池(Thread Pool)/缓存(cache)/对话框/处理偏好设置和注册表的对象/日志对象/充当打印机/显卡等设备的驱动程序的对象. 三.生活中用到的地方 1.考勤记录仪可以有多台,但是时钟必须只有一个,所有的考勤记录必须根据这个时钟来生成打

设计模式之单件模式

一.概述 /*    一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿.    其实,我们只需要一个实例对象就可以.如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响.    考虑到这些需要,我们将默认的构造函数声明为私有的,这样就不会被外部所new了,甚至可以将析构函数也声明为私有的,这样就只有自己能够删除自己了.    在Java和C#这样纯的面向对象的语

设计模式之单件模式(Singleton Pattern)

一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同时存在多个的话就会造成各种不一致的麻烦(你总不希望发生数据库重复连接的异常吧) 二.如何保证类的实例只有一个? (这个问题看似简单,但如果没有接触过单件模式的话,要自己想出来解决方案还是需要一些天赋的..不信的话,可以试着想想..) 1.类的实例可能只有一个吗?貌似只要知道类名就可以随便new了吧?

单件模式(Singleton Pattern)(转)

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

Java设计模式——线程安全的单件模式

单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重对这一点来进行分析解决. 最简单的单件模式的实现,代码如下: 1 /** 2 * Created by McBye King on 2016/10/23. 3 */ 4 public class Singleton { 5 private static Singleton singleton; 6

单件模式详解:懒汉式与饿汉式

class Instance{} //懒汉式 class LSingle{ private static  Instance _instance = null; private LSingle(){} public static Instance getInstance(){ if(_instance==null){ synchronized(LSingle.class){ _instance = new Instance(); } } return _instance; } } //饿汉式 c

设计模式(5)--单件模式

同步一个方法可能造成程序执行效率下降100倍. 静态初始化的控制权是在Java手上 一个类,一个责任 原则. ( 类应该做一件事,而且只做一件事)  但单件做了两件事, 一是 管理自己的实例(并提供全局访问变量) 二是在应用程序中担任角色, (1). 私有构造器.不提供对外访问   (2). 静态方法对外提供类本身实例.    (3)  . 只有一个实例 单例模式:  ( 管理共享资源 如数据库连接,或者线程池)  MVC  DAO Service 层 延迟实例化(懒汉式) 有线程安全问题  -