設計模式 單例模式簡單介紹一下

2021-10-25 02:16:18 字數 2386 閱讀 1429

有些物件我們只需要乙個如執行緒池、快取datasource、硬體裝置等。如果有多個例項會造成相互衝突、結果不一致的問題,畢竟你有我也有,但是你有的和我有的不一定真的一模一樣,是同乙個。使用單例模式可以確保乙個類最多只有乙個例項,並提供乙個全域性的訪問點。

public class test 

// private abc()

// abc n1 = new abc();

}public class cdb

}public static void main(string args)

}

那麼有什麼方法可以使得每次new出來的物件都是同乙個呢,看看下面單例模式類圖,就可以找到一些思路了!

singleton(單例)

static uniqueinstance(靜態的唯一物件申明)

private singleton() (私有的例項化方法)

static getinstance() (全域性訪問點)

了解了上面的內容,我們來寫乙個簡單的單例模式**,**如下:

public class singleton 

public static singleton getinstance()

return uniqeinstance;

}}

靜態變數由於不屬於任何例項物件,是屬於類的,所以在記憶體中只會有乙份,在類的載入過程中,jvm為靜態變數分配一次記憶體空間。

這個場景我們想象一下:乙個食品工廠,工廠只有乙個,然後工廠裡也只有乙個鍋,製作完一批食品才能製作下一批,這個時候我們的食品工廠物件就是單例的了,下面就是模擬實現的**,**的單例實現和上面的簡單實現不同,做了優化處理,稍後會解釋為什麼要優化

public class chocolatefactory 

public static chocolatefactory getinstance() }}

return uniqueinstance;

}// 第一步裝填

public void fill()

}// 第三步倒出

public void drain()

}// 第二步加熱

public void boil()

}}

在多執行緒的情況下,會有時間片的概念,cpu競爭,這剛好就是單例模式可能會發生問題的時候,會發生什麼樣的問題呢?以食品加工廠**為例

public synchronized static chocolatefactory getinstance() 

return uniqueinstance;

}

在多執行緒情況下會例項化出兩個物件

同步(synchronized)getinstance方法

執行緒1執行到if (uniqueinstance == null),被執行緒2搶走了執行權,此時執行緒1還沒有new物件;執行緒2同樣來到if (uniqueinstance == null),發現沒有物件例項,也打算例項化物件;最後執行緒1執行緒2都會執行uniqueinstance = new chocolatefactory();此時可以在getinstance()方法前加上synchronized修飾符同步方法,但是在多執行緒呼叫比較頻繁的時候,這種方式比較耗費效能。

「急切」建立例項

public class chocolatefactory 

return uniqueinstance;

}}

public static chocolatefactory uniqueinstance = new chocolatefactory();在應用啟動的時候就載入初始化一次例項物件,這個時候多執行緒呼叫永遠也只會有乙個例項,因為if (uniqueinstance == null)的結果一直是false;但如果這對單例物件在應用中沒有地方用到,使用這種方式則耗費掉了一些記憶體空間

雙重檢查加鎖(最佳)

public class chocolatefactory }}

return uniqueinstance;

}}

首先public volatile static chocolatefactory uniqueinstance = null;沒有在應用啟動的時候就初始化物件,節省了記憶體;其次synchronized修飾的**塊是再if (uniqueinstance == null) {}判斷裡面的,只有符合條件才會進入同步方法,減少了效能消耗。

單例模式簡單介紹

單例模式 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。特點 1.建構函式不對外開放,一般為private 2.通過乙個靜態方法或者列舉返回單例類物件 3.確保單例類的物件有且只有乙個,尤其是在多執行緒環境下。4.確保單例類物件在反序列化時不會重新構建物件。2.1 餓漢式 在宣告...

Python 設計模式介紹 單例模式

1 單例是只有乙個例項 2 通過靜態欄位 靜態字段偽造出乙個單例效果 3 什麼時候用 當所有例項中封裝的資料相同時,建立單例模式 eg 連線池 用單例模式建立連線池 class cp instance none def init self self.ip 1.1.1.1 self.port 3306...

設計模式之單例模式介紹

定義 單例模式保證在整個軟體系統記憶體中只存在乙個類的例項,並且該類只有乙個方法可以獲取例項。屬於建立型設計模式。注意 必須將該類的構造方法私有化。餓漢式 靜態常量 使用靜態常量的餓漢式單例模式demo public class eagersingletondemo1 public static e...