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

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 { }

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

你可能感兴趣的:(Singleton)