单例模式

在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例。
简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

单例模式_第1张图片
**Singleton 类**
namespace Singleton 
{ 
    public class Singleton 
    { 
        //定义一个私有的静态全局变量来保存该类的唯一实例 
        private static Singleton singleton;

        ///  
        /// 构造函数必须是私有的 
        /// 这样在外部便无法使用 new 来创建该类的实例 
        ///  
        private Singleton() 
        { 
        }

       ///  
        /// 定义一个全局访问点 
        /// 设置为静态方法 
        /// 则在类的外部便无需实例化就可以调用该方法 
        ///  
        ///  
        public static Singleton GetInstance() 
        { 
            //这里可以保证只实例化一次 
            //即在第一次调用时实例化 
            //以后调用便不会再实例化 
            if (singleton == null) 
            { 
                singleton = new Singleton(); 
            } 
            return singleton; 
        } 
    } 
}


**客户端代码**

using System;

namespace SingletonTest 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            Singleton.Singleton singletonOne = 
                Singleton.Singleton.GetInstance(); 
            Singleton.Singleton singletonTwo = 
                Singleton.Singleton.GetInstance();

            if (singletonOne.Equals(singletonTwo)) 
            { 
                Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一个实例"); 
            } 
            else 
            { 
                Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同一个实例"); 
            }

            Console.ReadKey(); 
        } 
    } 
}

多线程的情况下确保只new一个实例

namespace Singleton 
{ 
    public class Singleton 
    { 
        //定义一个私有的静态全局变量来保存该类的唯一实例 
        private static Singleton singleton;

        //定义一个只读静态对象 
        //且这个对象是在程序运行时创建的 
        private static readonly object syncObject = new object();

        ///  
        /// 构造函数必须是私有的 
        /// 这样在外部便无法使用 new 来创建该类的实例 
        ///  
       private Singleton() 
        {

        }

       ///  
        /// 定义一个全局访问点 
        /// 设置为静态方法 
        /// 则在类的外部便无需实例化就可以调用该方法 
        ///  
        ///  
        public static Singleton GetInstance() 
        { 
            //这里可以保证只实例化一次 
            //即在第一次调用时实例化 
            //以后调用便不会再实例化 

            //第一重 singleton == null 
            if (singleton == null) 
            { 
                lock (syncObject) 
                {

                            //第二重 singleton == null

                    if (singleton == null) 
                    { 
                        singleton = new Singleton(); 
                    } 
                } 
            } 
            return singleton; 
        } 
    } 
}

参考原文
http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html?login=1

你可能感兴趣的:(单例模式)