Singleton设计模式

来源:互联网 发布:lol能在mac上玩吗 编辑:程序博客网 时间:2024/05/19 06:37

Singleton的1.0版本

public class Singleton
{
private static final Singleton singleton = null;

private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
singleton= new Singleton();
}
return singleton;
}
}

在上面的实例中,几个Singleton的特点:

(1) 私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。

(2) 即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。

(3) 在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。所形成的实  例保存在自己类中的私有成员中。

(4) 我们取实例时,只需要使用Singleton.getInstance()就行了。

 

Singleton的1.3版本

public class Singleton
{
     private static final Singleton singleton = null;

     private Singleton()
     {
      }
public static Singleton getInstance()
    {

           if(singleton == null)

          {

               synchronized(Singleton.class)    

                  {   

                         if (singleton== null)
                             {
                                singleton= new Singleton();
                              }

                     }

            }
          return singleton;
    }
}

在这个版本中:

(1)第一个条件是说,如果实例创建了,那就不需要同步了,直接返回就好了。不然,我们就开始同步线程。

(2)第二个条件是说,如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用再创建了。

java中getIsntance 和 new之区别

(1)new   一定生成一个新的对象 ;  getInstance   不一定,可能只是将一个已经存在的引用给你

(2)大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过constructor生产一个新的实例对象。  
  getInstance是少部分类才有的一个方法,各自的实现也不同。getInstance在单例模式的类中常见,用来生成唯一的实例,getInstance往往是static的。