單例模式

面試的時候經常會有這樣一個問題:來你給我手寫一個單例模式吧.那麼什麼是單例模式.
人說我沒對象,java回答,我給你new一個.而單例是你有潛在的女朋友,我不能給你找新的,但是我可以給你把她通過特殊的渠道介紹給你,這個女朋友是心屬於你的(私有),就在那等着你召喚(靜態),所以這麼說來,單例這個女朋友的核心思想就是–私有(private).靜態(static).
那麼衆所周知,單例模式分爲懶漢模式和餓漢模式,懶漢模式安全,線程同步,餓漢模式不安全,不線程同步.各有妙用.
那麼簡單的單例模式是怎樣組成的?簡單的來說分爲一個單例對象,一個測試類.代碼如下:
1.SingletonPatternObject.java

package com.example.singletonPattern;

/**
 * Created by zhangrui on 2018/4/18.
 */
/*
* @ClassName SingletonPatternObject
*@Description TODO
*@Author zhangrui
*@Date 17:33 17:33
*@Version
* */
public class SingletonPatternObject {
    private static SingletonPatternObject singletonPatternObjectInstance = new SingletonPatternObject();
    private SingletonPatternObject(){}
    public static SingletonPatternObject getSingletonPatternObjectInstance(){
        return singletonPatternObjectInstance;
    }
    public void showMessage(){
        System.out.println("Hello,this is from the class of SingletonPatternObject!");
    }
}

2.SingletonPatternDemo.java

package com.example.singletonPattern;

/**
 * Created by zhangrui on 2018/4/18.
 */
/*
* @ClassName SingletonPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 17:40 17:40
*@Version 
* */
public class SingletonPatternDemo {
    public static void main(String[] args) {
        //私有不能實例化
        //SingletonPatternObject singletonPatternObject = new SingletonPatternObject();

        SingletonPatternObject singletonPatternObject = SingletonPatternObject.getSingletonPatternObjectInstance();
        singletonPatternObject.showMessage();
    }
}

可以看到,直接new對象的話會報錯,截圖如下:
這裏寫圖片描述
通過對象得到實例的話會打印出來單例對象的一句話:
這裏寫圖片描述
那麼接下來是懶漢模式,懶漢模式就是每次創建對象的時候先對對象判斷一下,沒有這個對象的時候我在給你這個對象,有的話就不給了,雙鎖結構,方法上鎖,內容上鎖:
3:LazySingletonPatternDemo.java

package com.example.singletonPattern;

/**
 * Created by zhangrui on 2018/4/19.
 */
/*
* @ClassName LazySingletonPatternDemo
*@Description TODO 懶漢模式 雙鎖結構 DCL double check lock
*@Author zhangrui
*@Date 17:19 17:19
*@Version 
* */
public class LazySingletonPatternDemo {
    private static LazySingletonPatternDemo lazySingletonPatternDemoInstance;
    private LazySingletonPatternDemo(){};
    //線程同步
    public static synchronized LazySingletonPatternDemo getInstance(){
        if (lazySingletonPatternDemoInstance==null){
            synchronized (LazySingletonPatternDemo.class){
                lazySingletonPatternDemoInstance = new LazySingletonPatternDemo();
            }
        }
        return lazySingletonPatternDemoInstance;
    }
}

餓漢模式就是葷素不忌,不管你有沒有,我都會給你提供這麼一個對象.
4.HungarySingletonPatternDemo.java

package com.example.singletonPattern;

/**
 * Created by zhangrui on 2018/4/19.
 */
/*
* @ClassName HungarySingletonPatternDemo
*@Description TODO 餓漢模式
*@Author zhangrui
*@Date 18:04 18:04
*@Version 
* */
public class HungarySingletonPatternDemo {
    private static HungarySingletonPatternDemo hungarySingletonPatternDemoInstence;
    private HungarySingletonPatternDemo(){}
    private HungarySingletonPatternDemo getHungarySingletonPatternDemoInstence(){
        return hungarySingletonPatternDemoInstence;
    }
}

那麼以後再有面試問你,給我手寫一個單例模式,那就灑灑水了.
本模式代碼鏈接都放在了GitHub上,有博主整理的幾個設計模式,逐漸豐富,鏈接地址爲:https://github.com/zhangruibin/designPattern
over!

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