JAVA中的餓漢式和飽漢式單例模式及jdk中Runtime類的單例模式實現方式詳解
阿新 • • 發佈:2019-02-13
一、描述
單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。
java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件用static休息並且在類載入的時候進行初始化;另一種是飽漢方式,在程式中需要用到該物件的時候才初始化,一旦初始化一次就不會再重新生成該物件。
JDK中的Runtime類其實也是一種單例模式,而且其採用的是餓漢的方式。
二、原始碼
三、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); } }
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() {} }