面試的時候經常會有這樣一個問題:來你給我手寫一個單例模式吧.那麼什麼是單例模式.
人說我沒對象,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!