首页 > 代码库 > 设计模式-单键(Singleton)

设计模式-单键(Singleton)

【摘要】
   在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

       如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?  

       这应该是类设计者的责任,而不是使用都的责任。

【全文】

单键模式(Singleton) 

动机  

       在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

       如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

       这应该是类设计者的责任,而不是使用都的责任。

意图

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

实现思路

       我们常用的方案是对一个单件对象进行惰性初始化,即仅当第一次使用这个对象时才对这个对象进行初始化。

 

       其实,Singleton模式是设计模式中最简单的一个,因为一个对象的实现化一般是通过new来实现的,而如果我们将构造函数设为私有,那么该对象就不对被“显式”的实例化,然后我们提供一个方法来返回此对象的实例,而在这个方法,我们就大有文章可做了。

C#例子

public class SingeltonSimply  

    { 

        private SingeltonSimply() 

        {

        }

        private static SingeltonSimply singelton;


        public static SingeltonSimply Instance  

        {  

            get  

            {  

                if (singelton == null)  

                {  

                    singelton = new SingeltonSimply();  

                }  

                return singelton;  

            }

         }

    }

    public class Client  

    {  

        public static void Main()  

        {  

            SingeltonSimply Instance = SingeltonSimply.Instance;

        }  

    }

 

Java例子

package pattendesign;

public class Singelton  

{  

    private static Singelton Instance = null;  

    private Singelton()  

    {  

    }  

    public static synchronized Singelton GetInstance()  

    {  

        if(Instance==null)

        {

            Instance = new Singelton();  

        }

        return Instance;  

    }  

}

  

package pattendesign; 

 

public class Client  

{  

    public Client()  

    {  

    }

    public static void main(String[] args)  

    {  

        Singelton singelton = Singelton.GetInstance();  

    }  

}

备注

1、其实JavaC#的代码实现基本一致,只是java不支持属性,所以用一个方法来获得实例;
  

2、以上两个例子均无考虑多线程的情况;