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入門學習-學習static的用法Java
- Java自學入門之靜態變數Java變數
- C++ 靜態變數單例模式的誤會(執行緒安全)C++變數單例模式執行緒
- C++ static variable(靜態變數) 學習C++變數
- 靜態變數和例項變數區別?變數
- C#靜態建構函式及靜態變數學習C#函式變數
- 靜態變數和非靜態變數變數
- Java入門學習- 理解List和HashMap和HashTable的用法和區別JavaHashMap
- Java入門學習-理解super,this,@override的用法JavaIDE
- Java靜態變數塊使用案例Java變數
- IOS 單例模式的學習iOS單例模式
- Java設計模式學習06——靜態代理與動態代理Java設計模式
- 關於單例及靜態變數測試單例變數
- Java設計模式學習筆記(五) 單例模式Java設計模式筆記單例
- 設計模式學習-單例模式設計模式單例
- 關於例項變數和靜態變數的一點疑問變數
- 設計模式學習-使用go實現單例模式設計模式Go單例
- mybatis 學習--mybatis基本用法入門MyBatis
- maven學習(上)- 基本入門用法Maven
- 設計模式學習之單例模式設計模式單例
- React入門學習例項React
- 小學生學習設計模式之單例模式設計模式單例
- 靜態變數和Session變數Session
- Java入門學習-學習if & else,for迴圈,foreach迴圈,while迴圈的用法。JavaWhile
- 從例項出發,瞭解單例模式和靜態塊單例模式
- 聊聊 AI 學習入門 - 數學和資訊理論AI
- java/android 設計模式學習筆記(1)--- 單例模式JavaAndroid設計模式筆記單例
- JAVA學習篇--靜態代理VS動態代理Java
- JavaScript入門學習之旅(一)——JavaScript變數提升和函式提升JavaScript變數函式
- JNI/NDK開發指南(7):C/C++訪問Java例項變數和靜態變數C++Java變數
- 設計模式學習筆記(四)單例模式的實現方式和使用場景設計模式筆記單例
- javascript快速入門2--變數,小學生數學與簡單的互動JavaScript變數
- Java 靜態代理和動態代理的使用及原理解析Java
- 設計模式快速學習(三)單例模式設計模式單例
- 設計模式學習筆記——單例模式設計模式筆記單例
- JavaScript設計模式學習之單例模式JavaScript設計模式單例
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數