【设计模式】单例模式

来源:互联网 发布:日本留学英语 知乎 编辑:程序博客网 时间:2024/05/27 16:43

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类成为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

实现一:普通单例模式

using System;using System.Collections.Generic;using System.Text;namespace 单例模式{    class Singleton    {        private static Singleton instance;        private Singleton() { }        public static Singleton GetInstance()        {            if (instance == null)                instance = new Singleton();            return instance;        }    }    class Program    {        static void Main(string[] args)        {            Singleton s1 = Singleton.GetInstance();            Singleton s2 = Singleton.GetInstance();            if (s1 == s2)                Console.WriteLine("两个对象是相同的实例!");            Console.Read();        }    }}


实现二:多线程时的单例模式,双重锁定

using System;using System.Collections.Generic;using System.Text;namespace 双重锁定单例模式{    class Singleton    {        private static Singleton instance;        private static readonly object syncRoot = new object();        private Singleton()        {         }        public static Singleton GetInstance()        {            if (instance == null)            {                lock (syncRoot)                {                    if (instance == null)                    {                        instance = new Singleton();                    }                }            }            return instance;        }    }    class Program    {        static void Main(string[] args)        {            Singleton s1 = Singleton.GetInstance();            Singleton s2 = Singleton.GetInstance();            if (s1 == s2)                Console.WriteLine("两个对象是相同的实例!");            Console.Read();        }    }}


实现三:静态初始化单例模式

C#与公共语言运行库提供的“静态初始化”方法,不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题【MSDN】

这种静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例模式。

之前的单例模式要在第一次被引用时,才会将自己实例化,称为懒汉式单例模式。

using System;using System.Collections.Generic;using System.Text;namespace 静态初试化{    public sealed class Singleton    {        private static readonly Singleton instance = new Singleton();        private Singleton() { }        public static Singleton GetInstance()        {            return instance;        }    }    class Program    {        static void Main(string[] args)        {            Singleton s1 = Singleton.GetInstance();            Singleton s2 = Singleton.GetInstance();            if (s1 == s2)                Console.WriteLine("两个对象是相同的实例!");            Console.Read();        }    }}


 

原创粉丝点击