1. 程式人生 > >設計模式(第一式:單例模式)

設計模式(第一式:單例模式)

spring框架 有意義 註釋 特性 是否 span cpu 我們 可能

概念:
單例模式:確保一個類只有一個實例化對象。即就是一個系統中只有一個實體對象。
在單例模式中又分為兩種模式:餓漢式單例和懶漢式單例。
餓漢式單例:在類加載的時候初始化實例。
懶漢式單例:在第一次引用的時候初始化實例。
實現:
餓漢式單例:

 1         public class HungrySingleCase {
 2             //私有化構造方法
 3             private HungrySingleCase(){}
 4             //在內部實例化對象,靜態保證了在該類家在的時候會執行一次,且僅執行一次。同樣私有化是我們通常習慣暴露get方法對外提供訪問。
5 private static HungrySingleCase singleCase = new HungrySingleCase(); 6 //提供get方法 7 public static HungrySingleCase getSingleCase(){ 8 return singleCase; 9 } 10 }

懶漢式單例:

 1         public class SluggardSingleCase {
2 //私有化:不允許外部new該對象 3 private SluggardSingleCase(){} 4 //私有:習慣上我們只提供get方法訪問對象。靜態:加載但我們並不初始化,因為我們需要它在第一次引用時實例化,而不是類加載時實例化。 5 private static SluggardSingleCase sluggardSingleCase = null; 6 //添加同步,防止在第一次引用時多線程並發,可能會出現多個實例對象。提供get方法。 7 synchronized
public static SluggardSingleCase getSingleCase(){ 8 //判斷該對象是否為null,本質是判斷否第一次引用 9 if (sluggardSingleCase == null){ 10 sluggardSingleCase = new SluggardSingleCase(); 11 } 12 return sluggardSingleCase; 13 } 14 }

分析:上面的實現中,我也盡可能的簡單明了的寫了註釋,接下裏我們更詳細的分析一下單例模式。
1.單例就必然得私有化構造方法,其中提供的get方法必然是靜態的,那麽它所用的變量或者別的方法也必然是靜態的。
2.餓漢式單例是使用語言特性實現的單例模式,懶漢式單例主要是通過我們書寫邏輯實現的單例模式。
3.從實現上分析,餓漢式比懶漢式更占用內存資源。懶漢式比餓漢式更占用CPU資源。
4.無論是哪種模式的單例,因為都是靜態的原因,所以無論是它有父類或者有子類,就單例模式下都是沒有意義的。所以也就基本不存在擴展。
5.單例固然整個系統中就只有一個,而且一般對於工具類或者可共享的都是整個系統就一個,可以免去很多比必要的創建對象和銷毀對象,從而提升系統性能。
6.適合單例的場景:
a.整個系統中只需要一個
b.創建對象需要的資源比較多,對象並不要求每次都是新對象。如IO對象或數據庫訪問對象。
c.需要定義大量靜態的工具類,或者本身工具類就也可以設計成單例。
……
經典框架中使用的:
Spring框架中,管理Bean,默認生成的對象就是以單例模式生成;Struts2框架中,工廠對象基本都是使用單例模式生成。等等……

設計模式(第一式:單例模式)