Java部分設計模式簡單例子

模式例子逐步完善,參考完整代碼在GitHub

地址:https://github.com/ZhangXiaoixiang/patter23

1單例模式(餓漢式)

package com.demo.patter01;

/**
 * SingletonDemo1
 * 測試餓漢式單例模式
 * @author 10905 2018/12/23
 * @version 1.0
 */
public class SingletonDemo1 {
    /**
     * 1 類初始化時,立即加載這個對象(沒有延時加載的優勢)。加載類時,天然的是線程安全的.這裏使用的private封裝對象(主要是安全層面的訪
     *   問修飾符,和一般的屬性封裝爲private是一樣的,沒有什麼特別的意思)
     *   static修飾是爲了實例化對象的時候的方便使用類名.方法名的方式得到這個類的單例對象
     */
    private static SingletonDemo1 instance=new SingletonDemo1();

    /**
     * 2 私有構造器(在本類的如果要繼續new對象可以,private,public修飾構造器沒有區別,但是外部調用該類,必須使用private修飾以防止外部
     * new出新對象,所以這裏必須是private修飾構造器)
     */
    private SingletonDemo1() {
    }
    /**
     * 3 公開調用方法,方法沒有同步,調用效率高!(必須要提供給外部一個方法創建這個類的單例(唯一)對象的方法,因爲第一步static修飾類屬性的
     * (就是一個對象),所以這裏也必須使用static修飾返回的對象)
     */
    public static SingletonDemo1 getInstance(){
        return instance;
    }

    /**
     * 這是在本類測試,所以上面的化構造器即使是private修飾爲私有的,但是在本類仍然可以使用構造器new對象,所以我這裏寫的main方法主要是爲了
     * 加深對構造器爲什麼要私有化的理解二特意在這裏的,
     * 當然,要測試單例,應該在另一個類中寫個main方法測試(或者junit測試)
     * @param args
     */

    public static void main(String[] args) {
        SingletonDemo1 instance = SingletonDemo1.getInstance();
        System.out.println(instance);
        SingletonDemo1 instance1 = SingletonDemo1.getInstance();
        System.out.println(instance1);
        /**
         * 構造器私有化了,爲什麼仍然可以new的原因是因爲這個main方法寫在了單例類的內部,當然可以使用構造器(故意寫在這裏的)
         */
        SingletonDemo1 singletonDemo1=new SingletonDemo1();
        SingletonDemo1 singletonDemo2=new SingletonDemo1();
        System.out.println(singletonDemo1);
        System.out.println(singletonDemo2);
        /**
         * 說明:instance和instance1肯定是一個對象,但是singletonDemo1和singletonDemo2不是一個對象了
         */
    }

}

單例模式(懶漢式)

package com.demo.patter01;

/**
 * SingletonDemo2
 * 測試懶漢式單例模式 優點:延時加載  缺點:調用效率低
 * @author 10905 2018/12/23
 * @version 1.0
 */
public class SingletonDemo2 {
    /**
     * 類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)。
     */
    private static SingletonDemo2 instance;

    /**
     * 私有化構造器
     */
    private SingletonDemo2(){
    }

    /**
     *  方法同步,調用效率低!
     *  我的解釋:爲什麼需要synchronized同步了?因爲懶加載類初始化的時候沒有及時new對象,所以試想一下,多個地方使用該類,
     *  但是生成實例的時間點不一樣,如果不同步,那麼久保證不了單例,並且線程不安全
     */
    public static  synchronized SingletonDemo2  getInstance(){
        if(instance==null){
            instance = new SingletonDemo2();
        }
        return instance;
    }

}

單例模式(靜態內部類)

package com.demo.patter01;

/**
 * SingletonDemo4
 * 測試靜態內部類實現單例模式  (推薦使用)
 * 這種方式:線程安全,調用效率高,並且實現了延時加載!
 * @author 10905 2018/12/23
 * @version 1.0
 */
public class SingletonDemo4 {
    /**
     * 這是一個靜態內部類,可以發現並沒有立即加載該類,實現延遲加載的效果,直到調用才加載
     */
    private static class SingletonClassInstance {
        /**
         * static可以加final修飾,但是其實沒有必要
         */
        private static  SingletonDemo4 instance = new SingletonDemo4();
    }

    /**
     * 構造器私有化
     */
    private SingletonDemo4(){
    }

    /**
     *  方法沒有同步,調用效率高!,調用的時候纔去靜態內部類new對象,實現延時加載
     */

    public static SingletonDemo4  getInstance(){
        return SingletonClassInstance.instance;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章