設計模式之單例模式

2021-07-29 16:27:10 字數 2555 閱讀 3606

單例,顧名思義,就是指在系統的執行過程中某乙個類只有唯一乙個物件存在。單例模式,就是實現這樣一種方式的乙個設計模式。

所有的單例的寫法都有非常明顯的特徵,那就是構造器私有化,就是防止物件被其他類建立。由類自己建立物件,並且對外提供獲得該物件的方法,從而實現單物件,根據建立物件方法的不同,可以有以下幾種表現形式

所謂的餓漢形式,其實就是指物件在類被載入的時候就被建立,具體過程如下所示。

/**

* 單例模式的餓漢形式

*@author xuhuanfeng

* */

class taskmanager

// 靜態屬性,在類被載入的時候就會進行初始化,也就是建立該物件

private

static taskmanager taskmanager = new taskmanager();

// 對外的訪問方法,用於獲得物件

public

static taskmanager getinstance()

}

對應的測試類如下

@test

public

void

testtaskmanager()

輸出的結果為

obj one cn.xuhuanfeng

.sigleton

.taskmanager

@15db9742

obj two cn.xuhuanfeng

.sigleton

.taskmanager

@15db9742

從上面我們可以看到,類taskmanager僅產生乙個物件。

餓漢方式看起來非常直觀,**書寫起來也非常方便,但是,這種方式的優缺點卻非常明顯

所謂的懶漢形式,就是指當需要物件的時候才建立物件,也就是延遲載入,具體過程如下所示

class taskmanager 

// 靜態屬性,但是這裡不進行初始化,也就是載入的時候其值會預設為null

private

static taskmanager taskmanager;

// 由於呼叫方法的時候,可能會發生併發現象,所以這裡需要使用synchronized進行鎖定

public

static

synchronized taskmanager getinstance()

return taskmanager;

}}

對應的測試類同上,這裡省略不寫

輸出的結果如下所示

obj one cn.xuhuanfeng

.sigleton

.taskmanager

@5010be6

obj two cn.xuhuanfeng

.sigleton

.taskmanager

@5010be6

懶漢方式看起來跟餓漢形式非常接近,主要區別在於物件建立的時間,也正是由於這個不同,其優缺點也比較明顯

所謂的靜態內部類是指,利用靜態內部類只有在被呼叫的時候才會被載入的特性,同時,類的靜態屬性在類被載入時會自動初始化,實現延遲載入,具體過程如下

class taskmanager 

// 私有的靜態內部類

private

static

class task

// 對外的訪問方法,用於獲得物件

public

static taskmanager getinstance()

}

對應的測試類同上,這裡省略不寫

結果如下所示

obj one cn.xuhuanfeng

.sigleton

.taskmanager

@5010be6

obj two cn.xuhuanfeng

.sigleton

.taskmanager

@5010be6

可以看到,通過這種方式,可以實現單例物件,雖然思路比較繞,但是這種實現方式的優勢比前面兩個明顯

列舉類的實現,不過這種方面目前筆者只知道其寫法,還未理解其原理,所以無法做其他解釋,實現**如下

/**

* 單例模式的列舉型別實現

*@author xuhuanfeng

* */

enum taskmanager

測試類同上

可以看到,這種方式非常簡便,而且據網友的介紹,這種方式是比較好的一種方式,筆者正在努力弄懂。

今天學習了enum型別之後,對上面的定義方式也比較清楚了,上面定義的方式實際上是利用enum型別所定義出來的物件本身就是靜態常量的特性,而且是對應該型別的乙個物件,而且可以根據需要增加新方法等實現的,關於enum可以參見筆者的enum學習筆記

本節介紹了單例模式及其作用,以及常見的實現單例模式的幾種方式,其中靜態內部類以及列舉類是實現單例模式比較好的兩種做法,也是比較推薦的做法。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...