本文目錄一覽:
java 單例模式
System.out.println (Singleton.getInstance());
System.out.println (Singleton.getInstance());
main 函數中有這兩句,一摸一樣。
第一句執行的時候,第一次調用getInstance(),意思是要獲取Singleton的一個對象實例。
而正常情況下,我們要獲取對象的話是用 new Singleton(),這個方法的,但是這個方法在Singleton裡面被聲明為:private ,意思是外界不能調用。
不能調用,我怎麼用你的對象?
Singleton裡面實現了生成對象的方法,getInstance(),你要用他的對象就必須調用這個方法。
而這個方法裡面你也看到了,如果
if(instance == null){
instance = new Singleton();
}
如果沒有實例則創建一個新的,但是已經創建過的話,就返回已經存在的實例。
所以輸出結果:
net.chelson.chapter5.Singleton@de6ced
net.chelson.chapter5.Singleton@de6ced
你兩次調用的這個對象的內存地址都是相同的,也就是說,是同一個東西(對象)
這個總的來說就是:
類的構造方法私有化(防止外界構造新對象)
提供獲取實例的方法(用於外界調用)
作用:用於提供只能有一個實例的對象。
如何在Java中實現單例模式?
單例模式大致有五種寫法,分別為懶漢,惡漢,靜態內部類,枚舉和雙重校驗鎖。
1、懶漢寫法,常用寫法
class LazySingleton{
private static LazySingleton singleton;
private LazySingleton(){
}
public static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
2、惡漢寫法,缺點是沒有達到lazy loading的效果
class HungrySingleton{
private static HungrySingleton singleton=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return singleton;
}
}
3、靜態內部類,優點:載入時不會初始化靜態變數INSTANCE,因為沒有主動使用,達到Lazy loading
class InternalSingleton{
private static class SingletonHolder{
private final static InternalSingleton INSTANCE=new InternalSingleton();
}
private InternalSingleton(){}
public static InternalSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
4、枚舉,優點:不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對象
enum EnumSingleton{
INSTANCE;
public void doSomeThing(){
}
}
5、雙重校驗鎖,在當前的內存模型中無效
class LockSingleton{
private volatile static LockSingleton singleton;
private LockSingleton(){}
//詳見:
public static LockSingleton getInstance(){
if(singleton==null){
synchronized(LockSingleton.class){
if(singleton==null){
singleton=new LockSingleton();
}
}
}
return singleton;
}
}
參考自:
java怎麼實現單實例運行
Java實現單例的5種方式
1. 什麼是單例模式
單例模式指的是在應用整個生命周期內只能存在一個實例。單例模式是一種被廣泛使用的設計模式。他有很多好處,能夠避免實例對象的重複創建,減少創建實例的系統開銷,節省內存。
2. 單例模式和靜態類的區別
首先理解一下什麼是靜態類,靜態類就是一個類裡面都是靜態方法和靜態field,構造器被private修飾,因此不能被實例化。Math類就是一個靜態類。
知道了什麼是靜態類後,來說一下他們兩者之間的區別:
1)首先單例模式會提供給你一個全局唯一的對象,靜態類只是提供給你很多靜態方法,這些方法不用創建對象,通過類就可以直接調用;
2)單例模式的靈活性更高,方法可以被override,因為靜態類都是靜態方法,所以不能被override;
3)如果是一個非常重的對象,單例模式可以懶載入,靜態類就無法做到;
那麼時候時候應該用靜態類,什麼時候應該用單例模式呢?首先如果你只是想使用一些工具方法,那麼最好用靜態類,靜態類比單例類更快,因為靜態的綁定是在編譯期進行的。如果你要維護狀態信息,或者訪問資源時,應該選用單例模式。還可以這樣說,當你需要面向對象的能力時(比如繼承、多態)時,選用單例類,當你僅僅是提供一些方法時選用靜態類。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/285183.html