定義:
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。
特點:
1、單例類只能有乙個例項。
2、單例類必須自己自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項
單例模式的要點:
1,私有的構造方法
2,指向自己例項的私有靜態引用
3,以自己例項為返回值的靜態的公有的方法
單例模式根據例項化物件時機的不同分為兩種:
一種是餓漢式單例,一種是懶漢式單例。
餓漢式單例在單例類被載入時候,就例項化乙個物件交給自己的引用。
懶漢式在呼叫取得例項方法的時候才會例項化物件。
/**
* 單例模式--餓漢式
* * @author wanting
* */
public class singleton_hungry
}
/**
* 單例模式--懶漢式(下面的兩種都是執行緒安全的)
* * @author wanting
* */
public class singleton_lazy
return instance;
} // 利用雙重鎖的方式將鎖粒度減小了
public static singleton_lazy getinstance_2()
}} return instance;
}}
單例模式的優點:
1,在記憶體中只有乙個物件,節省記憶體空間。
2,避免頻繁的建立銷毀物件,可以提高效能。
3,避免對共享資源的多重占用。
4,可以全域性訪問。
單例模式的缺點:
1,擴充套件困難,由於getinstance靜態函式沒有辦法生成子類的例項。如果要拓展,只有重寫那個類。
2,隱式使用引起類結構不清晰。
3,導致程式記憶體洩露的問題。
適用場景:
1,需要頻繁例項化然後銷毀的物件。
2,建立物件時耗時過多或者耗資源過多,但又經常用到的物件。
3,資源共享的情況下,避免由於資源操作時導致的效能或損耗等
4,控制資源的情況下,方便資源之間的互相通訊。
再貼一種懶漢式的另一種的寫法:
/**
* 內部類在使用時才被載入,所以只有在使用時才會存在於記憶體中;由於 singletonholder 是私有的,除了 getinstance()
* 之外沒有辦法訪問它,因此它是懶漢式的;同時讀取例項的時候不會進行同步,沒有效能缺陷;也不依賴 jdk 版本。
* * @author wanting
* */
public class singleton_improve
public static final singleton_improve getinstance()
}
public class singleton_lazy implements serializable
}/**
* 執行緒安全,鎖粒度較小(雙重鎖)
** @return
*/public static singleton_lazy getinstance() throws exception }}
return instance;
}/**
* 保證反序列化安全
*/protected object readresolve() throws exception
}
設計模式 一 單例模式
思路 1 如果其他程式能夠隨意用new建立該類物件,那麼就無法控制個數。因此,不讓其他程式用new建立該類的物件。2 既然不讓其他程式new該類物件,那麼該類在自己內部就要建立乙個物件,否則該類就永遠無法建立物件了。3 該類將建立的物件對外 整個系統 提供,讓其他程式獲取並使用。步驟 1 將該類中的...
設計模式(一) 單例模式
這種模式只涉及到乙個單一的類,該類負責建立自己的物件,並確保只建立乙個物件。單例只有乙個例項 單例類必須建立自己唯一的例項 單例類必須給其他物件提供這唯一的例項 由於當今的程式設計模型都是基於多執行緒方式,因此此處只介紹執行緒安全的幾種實現。第一次被呼叫時才建立物件,屬於懶載入 lazy init ...
設計模式(一) 單例模式
單例模式 保證執行記憶體中只有乙個實體的實現模式就是單例模式,最常見的有餓漢模式 懶漢模式兩種。餓漢模式 package com.madg.design.singleton public class hungry public hungry getinstance 懶漢模式 package com....