Java面向對象--單例(Singleton)設計模式和main方法

本篇博客是銜接上篇博客《Java面向對象--關鍵字(super、static、final)》中static關鍵字的應用拓展,具體介紹單例(Singleton)設計模式和main方法的使用。html


☍ 單例(Singleton)設計模式

單例(Singleton)設計模式概述

☃ 設計模式是在大量的實踐中總結和理論化以後優選的代碼結構、編程風格、以及解決問題的思考方式。java

☃ 所謂類的單例設計模式,就是採起必定的方法保證在整個的軟件系統中,對某個類 只能存在一個對象實例,而且該類只提供一個取得其對象實例的方法。數據庫

☃ 若是咱們要讓類在一個虛擬機中只能產生一個對象,咱們首先必須將類的構
造器的訪問權限設置爲private,這樣就不能用new操做符在類的外部產生類的對象了,但在類內部仍能夠產生該類的對象。由於在類的外部開始還沒法獲得類的對象,只能調用該類的某個靜態方法以返回類內部建立的對象,靜態方法只能訪問類中的靜態成員變量,因此指向類內部產生的該類對象
的變量也必須定義成靜態的。
編程

單例(Singleton)設計模式-餓漢式

➀ 私有化構造器設計模式

➁ 內部提供一個當前類的靜態化實例,先new出對象數組

➂ 提供公共的靜態方法,返回當前類的對象安全

class Singleton {
	// 1.私有化構造器
	private Singleton() {
	}
	// 2.內部提供一個當前類的靜態化實例,先new出對象
	private static Singleton single = new Singleton();
	// 3.提供公共的靜態的方法,返回當前類的對象
	public static Singleton getInstance() {
		return single;
	}
}

單例(Singleton)設計模式-懶漢式

➀ 私有化構造器多線程

➁ 內部提供一個當前類的靜態化實例,先不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;
	}
}

✦ 懶漢式存在線程安全問題,在多線程中可解決

兩種單例(Singleton)設計模式的優缺點

因爲單例模式只生成一個實例,減小了系統性能開銷,當一個對象的產生須要比較多的資源時,如讀取配置、產生其餘依賴對象時,則能夠經過在應用啓動時直接產生一個單例對象,而後永久駐留內存的方式來解決。

☃ 餓漢式:

優勢:餓漢式是線程安全的;

缺點:先直接建立對象,加載時間過長。

☃ 懶漢式:

優勢:延遲對象的建立,即用即分配

缺點:線程不安全,須要使用多線程解決。

☃ 如java.lang.Runtime包

單例(Singleton) 設計模式的應用場景

➥ 網站的計數器,通常是單例模式實現,不然難以同步。

➥ 應用程序的日誌應用,通常都使用單例模式實現,這通常是因爲共享的日誌文件一直處於打開狀態,只能有一個實例去操做,不然內容很差追加。

➥ 數據庫鏈接池的設計通常也是採用單例模式,由於數據庫鏈接是一種數據庫
資源。

➥ 項目中,讀取配置文件的類,通常也只有一個對象。沒有必要每次使用配置文件數據,都生成一個對象去讀取。

➥ Application也是單例的典型應用

➥ Windows的Task Manager (任務管理器)就是很典型的單例模式

➥ Windows的Recycle Bin (回收站)也是典型的單例應用。在整個系統運行過程
中,回收站一直維護着僅有的一個實例。


☍ 理解main方法的語法

public static void main(String args[]){
    //todo...
}

☄ 因爲Java虛擬機須要調用類的main()方法,因此該方法的訪問權限必須是
public,又由於Java虛擬機在執行main()方法時沒必要建立對象,因此該方法必須
是static的,該方法接收一個String類型的數組參數,該數組中保存執行Java命令時傳遞給所運行的類的參數。

☄ 又由於main()方法是靜態的,咱們不能直接訪問該類中的非靜態成員,必須建立該類的一個實例對象後,才能經過這個對象去訪問類中的非靜態成員


本博客與CSDN博客༺ཌ༈君☠纖༈ད༻同步發佈

相關文章
相關標籤/搜索