1. 程式人生 > >JAVA中的餓漢式和飽漢式單例模式及jdk中Runtime類的單例模式實現方式詳解

JAVA中的餓漢式和飽漢式單例模式及jdk中Runtime類的單例模式實現方式詳解

一、描述

單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。
 
      java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件用static休息並且在類載入的時候進行初始化;另一種是飽漢方式,在程式中需要用到該物件的時候才初始化,一旦初始化一次就不會再重新生成該物件。 JDK中的Runtime類其實也是一種單例模式,而且其採用的是餓漢的方式。

二、原始碼

package tong.yue.day4_25;

import java.io.IOException;
/**
 * 單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。
 * java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件用static休息並且在類載入的時候進行初始化;
 * 另一種是飽漢方式,在程式中需要用到該物件的時候才初始化,一旦初始化一次就不會再重新生成該物件。
 * jdk中的Runtime類其實也是一種單例模式,而且其採用的是餓漢的方式。
 * @author Administrator
 *
 */

public class Singleton {	
	
	public static void main(String[] args) {
		//餓漢式獲取單例類的物件
		Singleton_eager singleton = Singleton_eager.getInstance();
		singleton.print();
		//餓漢式獲取單例類的物件
		Singleton_lazy singleton_lazy = Singleton_lazy.getInstance();
		singleton_lazy.print();
		//jdk自帶的Runtime類的單例物件的使用
		Runtime runtime = Runtime.getRuntime();
		try {
			//使用Runtime的物件呼叫windows中的記事本,開啟一個記事本。
			runtime.exec("notepad.exe");
		} catch (IOException e) {
			System.out.println("記事本開啟失敗!");
			e.printStackTrace();
		}
	}
}
//餓漢式單例模式,在類載入的時候建立一個物件,之後就不再重複建立
class Singleton_eager {
	//宣告為static型別,在類載入的時候建立一個物件
	private static Singleton_eager singleton_eager = new Singleton_eager();
	private Singleton_eager(){
		
	}
	
	public static Singleton_eager getInstance() {
		return singleton_eager;
	}
	
	public void print() {
		System.out.println(singleton_eager);
	}
}
//飽漢式單例模式,當程式第一次使用該類的物件時建立物件,只建立一次,之後就不再重複建立
class Singleton_lazy{
	private static Singleton_lazy singleton_lazy = null;
	private Singleton_lazy(){}
	
	public static Singleton_lazy getInstance() {
		//若是第一次使用該物件,那個就建立一個,否則就使用一個已經建立好的物件
		if (singleton_lazy==null) {
			singleton_lazy = new Singleton_lazy();
		}
		return singleton_lazy;
	}
	
	public void print() {
		System.out.println(singleton_lazy);
	}
}
三、JDK中Runtime類的單例實現
package tong.yue.day4_25;
/**
 * JDK中的Runtime類的單例模式為餓漢式
 * @author tong
 *
 */
public class Runtime {
	    private static Runtime currentRuntime = new Runtime();	    
	    public static Runtime getRuntime() {
	        return currentRuntime;
	    }
	    
	    private Runtime() {}

}