1. 程式人生 > 其它 >插值查詢的實現與總結(Java)

插值查詢的實現與總結(Java)

技術標籤:設計模式java

什麼是單例模式

單例模式是指系統中的某個類只能有一個物件例項。為了保證類只能有一個物件例項,那麼就不能在外部使用new關鍵字來進行例項化,這樣就必須將這個類的構造方法私有化

單例模式的寫法有多種:

  • 餓漢式

  • 懶漢式(執行緒不安全)

  • 懶漢式(執行緒安全)

  • 雙重檢查

  • 靜態內部類

  • 列舉

其中懶漢式和雙重檢查由於效率問題,很少使用。

實現方式

餓漢式

實際工作中使用最多的就是餓漢式,程式碼如下:

public class SingletonHunger {
   // 定義一個靜態變數來儲存建立好的物件例項
   private static SingletonHunger instance =
new SingletonHunger(); // 構造方法私有化 private SingletonHunger() {}; // 提供一個靜態方法給外部呼叫來獲取物件例項 public static SingletonHunger getInstance() { return instance; } }

使用的時候呼叫類的靜態方法即可:

public class SingletonDemo {	
	public static void main(String[] args) {
		// 獲取單例物件
		SingletonHunger instance =
SingletonHunger.getInstance(); } }

在JDK中,java.lang.Runtime就是餓漢式單例模式 。

餓漢式在類裝載的時候就進行例項化,因此是執行緒安全的。但是如果例項化後一直不使用,則會造成記憶體浪費。

靜態內部類

為避免餓漢式可能會造成的記憶體浪費,可以使用靜態內部類的方式來建立單例,實現懶載入的效果。程式碼如下:

public class SingletonStatic {
	private static class Inner{
		private static final SingletonStatic INSTANCE = new SingletonStatic
(); } private SingletonStatic() {}; public static SingletonStatic getInstance() { return Inner.INSTANCE; } }

使用的時候呼叫類的靜態方法即可:

public class SingletonDemo {	
	public static void main(String[] args) {
		SingletonStatic instance = SingletonStatic.getInstance();
	}
}

靜態內部類方式在Singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getInstance方法,才會裝載類,從而完成Singleton的例項化。並且內部類的靜態屬性只會在第一次載入內部類的時候初始化 ,因此是執行緒安全的。

列舉

例項化類除了使用new關鍵字建立物件外,還可以使用反射和反序列化,如果要防止反射和反序列化重新建立物件 ,可以使用列舉類建立單例,程式碼如下:

public enum SingletonENUM {
	INSTANCE;
    
	public void getMessage() {
		System.out.println("Hello World");
	}
}

使用的時候呼叫列舉類的例項即可:

public class SingletonDemo {	
	public static void main(String[] args) {
		SingletonENUM instance = SingletonENUM.INSTANCE;
	}
}

雖然這種方式是最好的,但是在實際工作中反而是用得最少的,為什麼呢,因為太簡潔而導致可讀性太差。

歡迎關注我的公眾號,一起學習技術。

在這裡插入圖片描述