單例的餓漢與懶漢模式
阿新 • • 發佈:2018-12-19
單例模式 一個類只建立一個例項,每次都獲取的同一個物件 單例模式分為餓漢模式和懶漢模式 單例模式的三要素: 1、構造方法私有化 2、靜態屬性指向例項 3、public static 的xx方法要返回例項
餓漢模式
立即載入,無論是否用到這個物件都會載入 無論如何都會建立一個物件 啟動的時間較長,使用的時候較快
public class Hunger { /** * 單例模式:一個類只建立一個例項。每次都獲取同一個物件 * 餓漢單例模式:無論如何都會建立一個物件 */ //私有化構造方法,使得該類無法在外部通過new來例項化 private Hunger() { } //用new來例項化 一個物件 public static Hunger show = new Hunger(); //public static 來提供給呼叫者new的物件 public static Hunger getShow() { return show; } }
public class HungerTest {
public static void main(String[] args) {
//直接建立物件會報錯
//Hunger h = new Hunger();
//只能通過Hunger中的getShow來獲取物件
Hunger h1 = Hunger.getShow();
Hunger h2 = Hunger.getShow();//h1,h2都是同一個物件
System.out.println(h1==h2);
}
}
//結果為:true
懶漢模式 延遲載入,只有在使用的時候才載入 只有在呼叫方法的時候才建立例項 啟動快,第一次使用的時候慢
public class Lazy { /** * 單例模式:一個類只建立一個例項 * 懶漢模式:只有在呼叫方法的時候才建立例項 */ //私有化建構函式,使它不能通過new來建立例項 private Lazy() { } //準備一個例項化屬性,指向null public static Lazy show; //public static 方法,返回例項物件 public static Lazy getShow() { //判斷例項是否為空,如果為空就建立例項 if(null == show) { show = new Lazy(); } //返回例項指向的物件 return show; } }
public class LazyTest {
public static void main(String[] args) {
Lazy l1 = Lazy.getShow();
Lazy l2 = Lazy.getShow(); //l1,l2都是同一個物件
System.out.println(l1==l2);
}
}
//結果為:true
當有充分的啟動和初始化的時間時,使用餓漢模式,否則使用懶漢模式