Java入門學習-學會使用靜態變數、掌握單例模式的用法和原理
靜態變數在上一節已學習使用過,總結為類變數,只佔一塊記憶體,與例項化無關。
單例模式的意思是,每個類只有一個例項(一般用於資源管理,可以解決生產者-消費者問題)。
引用一段話
意圖:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
主要解決:一個全域性使用的類頻繁地建立與銷燬。
何時使用:當您想控制例項數目,節省系統資源的時候。
如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。
關鍵程式碼:建構函式是私有的。
應用例項: 1、一個黨只能有一個主席。 2、Windows 是多程式多執行緒的,在操作一個檔案的時候,就不可避免地出現多個程式或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 3、一些裝置管理器常常設計為單例模式,比如一個電腦有兩臺印表機,在輸出的時候就要處理不能兩臺印表機列印同一個檔案。
優點: 1、在記憶體裡只有一個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷燬例項(比如管理學院首頁頁面快取)。 2、避免對資源的多重佔用(比如寫檔案操作)。
缺點:沒有介面,不能繼承,與單一職責原則衝突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。
使用場景: 1、要求生產唯一序列號。 2、WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。 3、建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多執行緒同時進入造成 instance 被多次例項化。
//建立單例
public class SingleExample {
//建立一個私有的,靜態的例項
private static SingleExample example =new SingleExample();
//建立一個構造方法,不被例項化
private SingleExample(){
}
//建立一個唯一可用的物件
public static SingleExample getExample(){
return example;
}
}
public class UseSingle {
//使用單例
public static void main(String[] args) {
//SingleExample se=new SingleExample(); //提示 The constructor SingleExample() is not visible。說明私有的構造方法不能例項了
SingleExample se=SingleExample.getExample();
se.test(); //輸出Hello SingleExample
}
}
相關文章
- Java自學入門之靜態變數Java變數
- 關於單例及靜態變數測試單例變數
- Java設計模式學習筆記(五) 單例模式Java設計模式筆記單例
- 設計模式學習-使用go實現單例模式設計模式Go單例
- 從例項出發,瞭解單例模式和靜態塊單例模式
- 設計模式學習之單例模式設計模式單例
- 小學生學習設計模式之單例模式設計模式單例
- 設計模式學習筆記(四)單例模式的實現方式和使用場景設計模式筆記單例
- Java 靜態代理和動態代理的使用及原理解析Java
- 設計模式學習(一)單例模式補充——單例模式析構設計模式單例
- 設計模式:單例模式的使用和實現(JAVA)設計模式單例Java
- 設計模式快速學習(三)單例模式設計模式單例
- 設計模式學習筆記——單例模式設計模式筆記單例
- 機器學習的靜態特徵和動態特徵機器學習特徵
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 從JavaScript學習設計模式-02單例模式JavaScript設計模式單例
- Java靜態變數在靜態方法內部無法改變值Java變數
- vue 快速入門 系列 —— 例項方法(或 property)和靜態方法Vue
- Shell學習【變數使用】變數
- 聊聊 AI 學習入門 - 數學和資訊理論AI
- C++從靜態型別到單例模式C++型別單例模式
- javascript:私有變數 (靜態私有變數為什麼會被所以例項共享?-答疑解惑)JavaScript變數
- 學習java怎麼入門?怎樣學Java?Java
- C++學習隨筆——簡單的單例設計模式例項C++單例設計模式
- Java學習從入門到精通的學習建議Java
- Java學習路線·入門Java
- 學習Java怎麼入門?Java
- 靜態變數變數
- ABAP和Java單例模式的攻防Java單例模式
- Java靜態方法和例項方法 java中的陣列作為形參傳入Java陣列
- 機器學習入門:多變數線性迴歸機器學習變數
- 可汗學院使用Go靜態上下文理順全域性變數和依賴 - khanacademyGo變數
- ZipKin原理學習--ZipKin入門介紹
- 機器學習和深度學習概念入門機器學習深度學習
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- Java靜態代理模式Java模式
- springmvc簡單學習(一)-----入門SpringMVC