1.单例模式

1.定义

Ensure a class has only one instance,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

2.模式讲解

(1)类图

1.单例模式

(2)单例模式通用代码

 1 public class Singleton

 2 {

 3     private static Singleton singleton = new Singleton();

 4 

 5     private Singleton()

 6     {}

 7 

 8     public static Singleton GetSingleton()

 9     {

10         return singleton;

11     }

12 }

3.单例模式的多种实现方式

(1)简单的实现

    public sealed class Singleton

    {

        private static Singleton _instance = null;



        private Singleton()

        {

        }



        public static Singleton Instance

        {

            get

            {

                if (_instance == null)

                {

                    _instance = new Singleton();

                }

                return _instance;

            }

        }

    }

缺点:这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。

优点:直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton

(2)安全的线程

    public sealed class Singleton

    {

        private static Singleton _instance = null;



        private static readonly Object O = new object();



        private Singleton()

        {

        }



        public static Singleton Instance

        {

            get

            {

                lock (O)

                {

                    if (_instance == null)

                    {

                        _instance = new Singleton();

                    }

                    return _instance;

                }

            }

        }

    }

优点:这种方式的实现对于线程来说是安全的。我们首先创建了一个进程辅助对象,线程在进入时先对辅助对象加锁然后再检测对象是否被创建,这样可以确保只有一个实例被创建,因为在同一个时刻加了锁的那部分程序只有一个线程可以进入。这种情况下,对象实例由最先进入的那个线程创建,后来的线程在进入时(instence == null)为假,不会再去创建对象实例了。

缺点:这种实现方式增加了额外的开销,损失了性能。

(3)静态初始化,饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)

    public sealed class Singleton

    {

        private static readonly Singleton singleton = new Singleton();



        private Singleton()

        { }



        public static Singleton GetSingleton()

        {

            return singleton;

        }

    }

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