1. 判断对象是否为NUll

A: 为什么要等待需要的时候在实例化呢,你完全可以把声明的工作放到类的全局变量中完成。这样你就可以判断这个变量是否被实例化过了没。

2. 生还是不生是自己的责任

A: 我们完全可以直接把这个类的构造方法改成私有的,外部程序就不能用new来实例化他了。
A: 但是我们可以再写一个public方法,叫做GetInstance(),这个方法的目的返回一个类实例,而此方法中,去做是否都有实例化的判断。

3. 单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

A: 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化对个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
图1

class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();

            if (s1 == s2)
            {
                Console.WriteLine("Objects are the same instance");
            }

            Console.Read();
        }
    }


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

    }

    //public sealed class Singleton
    //{
    //    private static readonly Singleton instance = new Singleton();
    //    private Singleton() { }
    //    public static Singleton GetInstance()
    //    {
    //        return instance;
    //    }
    //}

A: 单例模式除了可以保证唯一的实例外,还有什么好处?
B: 单例模式因为Singleton类封装它的唯一实例,这样它可以严格控制客户怎么访问它以及何时访问它。简单的说就是对唯一实例的受控访问。
A: 实用类不保存状态,仅提供一些静态方法或静态属性让你使用,而单例类是有状态的。实用类不能用于继承多态,而单例虽然实例唯一,却是可以有子类来继承。实用类只不过是一些方法属性的集合,而单例却是有着唯一的对象的实例。

4. 双重锁定

public static Singleton GetInstance()
{
    if (instance == null)
    {
        lock (syncRoot)
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
        }
    }
    return instance
}

5. 静态初始化

A: 由于这种静态初始化方式是在自己被加载是就将自己实例化,所有形象的称之为饿汉式单例类;要在第一次被应用时,才会将自己实例化,所有称之为懒汉式单例类。
A: 饿汉式要提前占用资源;而懒汉式又会面临着多线程访问的安全性问题。


yuanoung
10 声望1 粉丝

« 上一篇
迭代器模式
下一篇 »
桥接模式

引用和评论

0 条评论