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

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

 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框架中,工廠對象基本都是使用單例模式生成。等等……

併發

相關文章
相關標籤/搜索