设计模式-单件模式

定义:确保一个类只有一个实例,并提供全局访问节点。

 

public class Singleton {

 

    //定义一个全局的静态对象

    private static Singleton mSingleton = null;

    

    //默认构造方法访问权限设置为Private,不提供外部范围

    private Singleton(){

        

    }

    

    //定义PublicgetInstance方法,提供唯一的外部访问接口

    public static Singleton getInstance(){

        if(mSingleton == null)

            mSingleton = new Singleton();

        return mSingleton;

    }

}    

通过以上代码我们就实现了单件模式,是不是非常简单呢?这样就可以让一个类提供唯一的对象。注意,如果你写的单件模式用于多线程中,这样的写法并不安全。那么我们应该怎么写呢?别急,马上为你揭晓。

public class Singleton {

 

    //定义一个全局的静态对象

    private static Singleton mSingleton = null;

    

    //默认构造方法访问权限设置为Private,不提供外部范围

    private Singleton(){

        

    }

    

    //定义PublicgetInstance方法,提供唯一的外部访问接口

    public static synchronized Singleton getInstance(){

        if(mSingleton == null)

            mSingleton = new Singleton();

        return mSingleton;

    }

}

仔细观察发现,我们只在getInstance方法中加入了synchronized关键字,这样迫使每一个线程访问此方法之前,要先等候别的线程离开。也就是说不会有两个或以上的线程同时访问这个方法,这个时候同步此方法就变得很累赘,也是不好的设计。还有改进的空间吗?

public class Singleton {

 

    //定义一个全局的静态对象

    private static Singleton mSingleton = new Singleton();

    

    //默认构造方法访问权限设置为Private,不提供外部范围

    private Singleton(){

        

    }

    

    //定义PublicgetInstance方法,提供唯一的外部访问接口

    public static Singleton getInstance(){

        return mSingleton;

    }

}

在静态初始化器中创建单件,这段代码保护了线程的安全,不就完美解决问题了吗?如果你不想在静态器中创建单件,那么接下来双重加锁的方法,可以为你提供良好解决办法。

public class Singleton {

 

    // 定义一个全局的静态对象

    private static volatile Singleton mSingleton = new Singleton();

 

    // 默认构造方法访问权限设置为Private,不提供外部范围

    private Singleton() {

 

    }

 

    // 定义PublicgetInstance方法,提供唯一的外部访问接口

    public static Singleton getInstance() {

        if (mSingleton == null) {

            synchronized (Singleton.class) {

                if (mSingleton == null)

                    mSingleton = new Singleton();

            }

        }

        return mSingleton;

    }

}

posted on 2015-03-22 23:29  jaden.xu  阅读(108)  评论(0)    收藏  举报

导航