本篇博客是銜接上篇博客《Java面向對象--關鍵字(super、static、final)》中static關鍵字的應用拓展,具體介紹單例(Singleton)設計模式和main方法的使用。html
☃ 設計模式是在大量的實踐中總結和理論化以後優選的代碼結構、編程風格、以及解決問題的思考方式。java
☃ 所謂類的單例設計模式,就是採起必定的方法保證在整個的軟件系統中,對某個類 只能存在一個對象實例,而且該類只提供一個取得其對象實例的方法。數據庫
☃ 若是咱們要讓類在一個虛擬機中只能產生一個對象,咱們首先必須將類的構
造器的訪問權限設置爲private,這樣就不能用new操做符在類的外部產生類的對象了,但在類內部仍能夠產生該類的對象。由於在類的外部開始還沒法獲得類的對象,只能調用該類的某個靜態方法以返回類內部建立的對象,靜態方法只能訪問類中的靜態成員變量,因此指向類內部產生的該類對象
的變量也必須定義成靜態的。編程
➀ 私有化構造器設計模式
➁ 內部提供一個當前類的靜態化實例,先new出對象數組
➂ 提供公共的靜態方法,返回當前類的對象安全
class Singleton { // 1.私有化構造器 private Singleton() { } // 2.內部提供一個當前類的靜態化實例,先new出對象 private static Singleton single = new Singleton(); // 3.提供公共的靜態的方法,返回當前類的對象 public static Singleton getInstance() { return single; } }
➀ 私有化構造器多線程
➁ 內部提供一個當前類的靜態化實例,先不new出對象性能
➂ 提供公共的靜態方法,返回當前類的對象網站
class Singleton { // 1.私有化構造器 private Singleton() { } // 2.內部提供一個當前類的實例聲明,此實例也必須靜態化,先不new出對象 private static Singleton single; // 3.提供公共的靜態的方法,返回當前類的對象 public static Singleton getInstance() { if(single == null) { single = new Singleton(); } return single; } }
✦ 懶漢式存在線程安全問題,在多線程中可解決
因爲單例模式只生成一個實例,減小了系統性能開銷,當一個對象的產生須要比較多的資源時,如讀取配置、產生其餘依賴對象時,則能夠經過在應用啓動時直接產生一個單例對象,而後永久駐留內存的方式來解決。
☃ 餓漢式:
優勢:餓漢式是線程安全的;
缺點:先直接建立對象,加載時間過長。
☃ 懶漢式:
優勢:延遲對象的建立,即用即分配
缺點:線程不安全,須要使用多線程解決。
☃ 如java.lang.Runtime包
➥ 網站的計數器,通常是單例模式實現,不然難以同步。
➥ 應用程序的日誌應用,通常都使用單例模式實現,這通常是因爲共享的日誌文件一直處於打開狀態,只能有一個實例去操做,不然內容很差追加。
➥ 數據庫鏈接池的設計通常也是採用單例模式,由於數據庫鏈接是一種數據庫
資源。
➥ 項目中,讀取配置文件的類,通常也只有一個對象。沒有必要每次使用配置文件數據,都生成一個對象去讀取。
➥ Application也是單例的典型應用
➥ Windows的Task Manager (任務管理器)就是很典型的單例模式
➥ Windows的Recycle Bin (回收站)也是典型的單例應用。在整個系統運行過程
中,回收站一直維護着僅有的一個實例。
public static void main(String args[]){ //todo... }
☄ 因爲Java虛擬機須要調用類的main()方法,因此該方法的訪問權限必須是
public,又由於Java虛擬機在執行main()方法時沒必要建立對象,因此該方法必須
是static的,該方法接收一個String類型的數組參數,該數組中保存執行Java命令時傳遞給所運行的類的參數。
☄ 又由於main()方法是靜態的,咱們不能直接訪問該類中的非靜態成員,必須建立該類的一個實例對象後,才能經過這個對象去訪問類中的非靜態成員
本博客與CSDN博客༺ཌ༈君☠纖༈ད༻同步發佈