深入浅出设计模式-005:单例模式(Singleton Pattern)

深入浅出设计模式-005:单例模式(Singleton Pattern)

一:单例模式,确保一个类只有一个实例,并提供一个全局访问点
    单例模式确保程序中只有一个实例
    单例模式也提供访问这个实例的全局点
    确定在性能和资源上的限制,然后小心地选择适当的方案实现单例,以解决多线程的问题。

    public sealed class Singleton1
    {
        //缺点:如果同时有两个线程去判断(instance == null),并且得到的结果为真,
        //      这时两个线程都会创建类Singleton的实例,这样就违背了Singleton模式的原则。
        //优点:由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能,即使它可能引入不想要的依赖性。
        //      直到对象要求产生一个实例才执行实例化;
        //      这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
        private static Singleton1 uniqueInstance = null;
        private Singleton1() { }

        public static Singleton1 getInstance()
        {
            if (uniqueInstance == null)
                uniqueInstance = new Singleton1();
            return uniqueInstance;
        }
    }
    public sealed class Singleton2
    {
        //优点:线程安全
        //缺点:每次执行操作时,都需要同步,而事实上只需要第一次构建时同步即可
        private static Singleton2 uniqueInstance = null;
        private static Object syncRoot = new Object();
        private Singleton2() { }

        public static Singleton2 getInstance()
        {
            lock (syncRoot) ;
            if (uniqueInstance == null)
            {
                uniqueInstance = new Singleton2();
            }
            return uniqueInstance;
        }
    }
    public sealed class Singleton3
    {
        //优点:线程安全,采用双重加锁减少每次都同步的确定
        //缺点:无法实现延迟初始化。
        private volatile static Singleton3 uniqueInstance = null;
        private static Object syncRoot = new Object();
        private Singleton3() { }

        public static Singleton3 getInstance()
        {
            if (uniqueInstance == null)
            {
                lock (syncRoot) ;
                if (uniqueInstance == null)
                    uniqueInstance = new Singleton3();
            }
            return uniqueInstance;
        }
    }
    public sealed class Singleton4
    {
        //优点:延迟加载,线程安全
        //缺点:对实例化机制的控制权较少。
        private static readonly Singleton4 uniqueInstance = new Singleton4();
        static Singleton4() { }
        private Singleton4() { }

        public static Singleton4 getInstance()
        {
            return uniqueInstance;
        }
    }

    public sealed class Singleton5
    {
        //静态构造函数,在调用时,和静态函数成员类似,都会被优先调用
        //缺点:线程不安全
        private static Singleton5 uniqueInstance = null;
        static Singleton5()
        {
            uniqueInstance = new Singleton5();
        }

        private Singleton5() { }
        public static Singleton5 getInstance()
        {
            return uniqueInstance;
        }
    }
    public sealed class Singleton6
    {
        //静态构造函数,在调用时,和静态函数成员类似,都会被优先调用
        //线程安全
        private static Singleton6 uniqueInstance = null;
        private static System.Threading.Mutex mutex;
        static Singleton6()
        {
            uniqueInstance = new Singleton6();
            mutex = new System.Threading.Mutex();
        }

        private Singleton6() { }

        public static Singleton6 getInstance()
        {
            mutex.WaitOne();
            return uniqueInstance;
        }
        public static void Release()
        {
            mutex.ReleaseMutex();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Singleton1.getInstance();
            Singleton2.getInstance();
            Singleton3.getInstance();
            Singleton4.getInstance();
            Singleton5.getInstance();
            Singleton6.getInstance();
        }
    }

你可能感兴趣的:(深入浅出设计模式-005:单例模式(Singleton Pattern))