2.面向对象设计模式学习之Singleton单件模式

来源:互联网 发布:苹果编程语言 编辑:程序博客网 时间:2024/06/06 18:33

Singleton单件(创建型模式)

1、动机(应用场景):

在软件系统中,必须保证系统中只存在一个实例,才能确保逻辑正确性和良好的效率。

2、意图:

保证一个类仅有一个实例,并提供全局访问点。

3、实现:

有的人可能会觉得,要保证一个系统中一个类只能有一个实例,那么这个类和平常一样写,然后你在系统中只实例化一次不就得了?

其实这应该是类的设计者的责任还,而不是类的使用者的责任。

 

 1)单线程下Singleton单件模式的实现:

单线程下Singleton单件模式实现的主要有两个步骤。

第一是构造器加上static静态字段,防止使用止使用的时候实例化;

第二是取得对象值的时候,判断对象是否已经存在(是否为null),如果存在,则无需实例化,直接返回对象的成员,如果不存在,则实例化。

    /// <summary>    /// 单线程下 Singleton 单件模式 例子    ///[ZengWenZhi] 2012-8-3创建    /// </summary>   public class Singleton    {       private static Singleton instance;       //私有构造器,防止被 new。       private Singleton() { }       public static Singleton Instance       {           get            {               if (instance==null)               {                   instance = new Singleton();               }               return instance;           }       }    }


2)多线程下Singleton单件模式的实现:

多线程下单件模式的关键技术是lock技术。如下代码所示,在多线程环境下,可能两个线程同时运行到A点(A\B点一下代码有标注),这样两个线程都会判断到instance对象为空,这样,两个线程都会运行到B点。假如没有B点的代码,就会创建两个instance对象,有了B点的代码就可以避免这个问题。

 

    /// <summary>    /// 多线程下 Singleton 单件模式 例子    ///[ZengWenZhi] 2012-8-3创建    /// </summary>    public class SingletonM    {        //volatile 当一个变量定义为volatile时,读取这个变量的值时候每次都是从momery里面读取而不是从cache读。        //这样做是为了保证读取该变量的信息都是最新的,而无论其他线程如何更新这个变量        private static volatile SingletonM instance = null;        private static object lockHelper = new object();        private SingletonM() { }        public static SingletonM Instance        {            get            {                if (instance==null)//A点                {                    lock (lockHelper)//B点                    {                        //双检查 预防代码编译的时候作出优化调整了代码执行顺序                        if (instance==null)                        {                            instance = new SingletonM();                        }                    }                }            return instance;            }        }    }


3、.net框架下Singleton单件模式的身影:

    /// <summary>    /// Singleton 单件模式实例    ///[ZengWenZhi] 2012-8-3创建    /// </summary>    class Program    {        static void Main(string[] args)        {            //.Net框架中的应用            MyClass class1 = new MyClass();            MyClass calss2 = new MyClass();            Type type1 = class1.GetType();            Type type2 = class1.GetType();            //发现两个输出是一样的,这说明全局中只有一个MyClass 的type对象。            Console.WriteLine(type1.ToString());            Console.WriteLine(type2.ToString());            Console.ReadLine();        }    }    //应用    class MyClass { }

重要声明:本文是笔者学习李建中老师的时候所记录笔记,里面知识并非原创。

原创粉丝点击