设计模式--单件模式

单件模式:

确保一个类只有一个实例,并提供一个全局的访问点.

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

关键词:

SingleTon:单独的

结构图:

image

实现1:

public sealed class SingleTon

{

    static SingleTon single = null;

	private SingleTon()

	{

		//

		//TODO: 在此处添加构造函数逻辑

		//

	}



    public static SingleTon GetInstance()

    {

        if (single == null)

        {

            single = new SingleTon();

        }



        return single;

    }

}

此种实现是不安全的,当有多个线程去访问时,会同时得到single==null为true.此时会得到singleton的两个实例.

实现2:

public sealed class SingleTon

{

    static SingleTon single = null;

    static readonly object padlock = new object();



    private SingleTon()

    {

        //

        //TODO: 在此处添加构造函数逻辑

        //

    }



    public static SingleTon GetInstance()

    {

        lock (padlock)

        {

            if (single == null)

            {

                single = new SingleTon();

            }

        }



        return single;

    }

}
此种实现对线程来说也是安全的,但是,每次访问之前,都需要加锁判断,此时会消耗大量的系统资源.所以,采用双重加锁的方式来进行设计.
实现3:
public sealed class SingleTon

{

    static SingleTon single = null;

    static readonly object padlock = new object();



	private SingleTon()

	{

		//

		//TODO: 在此处添加构造函数逻辑

		//

	}



    public static SingleTon GetInstance()

    {

        if (single == null)

        {

            lock (padlock)

            {

                if (single == null)

                {

                    single = new SingleTon();

                }

            }

        }



        return single;

    }

}
 

优点:

    1. SingleTon会保证只有此类只有一个实例,保证所有引用均引用自此实例
    2. 修改很方便,只需修改一处,即可保证全盘更新

缺点:

每次生成实例之前需要判断该实例是否存在

适用场景:

 当类有且只有一个实例时,可以使用SingleTon模式. 

解释:

lock:lock是确保一个线程位于代码的临界区时,另一个线程不能进入该临界区,如果其它线程试图进入锁定的代码,则它将一直等待,直到该对象被释放.

你可能感兴趣的:(设计模式)