基於Java從零開始實現設計模式(一)——單例模式

單例模式(singleton):每個類只允許一個實例,提供一個全局的訪問點,即通過將其構造方法設計爲private類型,使其無法通過new方法拿到其實例,只能通過類中定義的get方法拿到類的實例。其實現方案通常包括三種——懶漢式、餓漢式、final式,分析即實現如下:
1.:fina式
1.1 第一步:私有構造
1.2 第二步:定義公有靜態成員類

package designPattern;

public class Demo01_SingletonFinal {

	public static void main(String [] args) {
		SingletonFinal singletonFinal =  SingletonFinal.s;
	}

}

class SingletonFinal{
	private SingletonFinal() {}
	
	public final static SingletonFinal s = new SingletonFinal();
}

2:餓漢式
2.1 第一步:私有構造
2.2 第二步:靜態私有成員類
2.3 第三步:設置get

package designPattern;

public class Demo02_SingletonEH {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SingletonEH singletonEH = SingletonEH.getInstance();
	}

}


//單例設計模式之餓漢式
class SingletonEH{
	private SingletonEH() {}   //私有構造
	private static SingletonEH s = new SingletonEH(); //私有靜態,保證不被修改
	public static SingletonEH getInstance() {
		return s;
	}
	
}

3 懶漢式:懶漢式與餓漢式區別在於懶漢式在類的開頭不會對成-員對象進行賦值,換言之,不會佔用內存,等到需要使用成員對象(調用get()方法)時,在對這個成員對象進行賦值;

package designPattern;

public class Demo03_SingletonLH {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SingletonLH singleton1 = SingletonLH.getInstance();
		SingletonLH singleton2 = SingletonLH.getInstance();
	}

}


//單例設計模式之餓漢式
class SingletonLH{
	private SingletonLH() {}   //私有構造
	private static SingletonLH s; //先不申請內存,等到使用時在進行申請
	public static SingletonLH getInstance() {
		if (s == null) {
			s = new SingletonLH();
		}
		return s;
	}
	
}

注:關於懶漢式與餓漢式區別:最大的區別在於多線程,懶漢式由於在第19-22行一直在操作s,當有多個線程時,可能存在第一個線程執行完19行時,CPU剛好切換至第二個線程,第二個線程也會執行至19行,進而創建兩個SingletonLH對象,引發錯誤;其次一點區別在於懶漢式屬於時間換空間,餓漢式屬於時間換空間,故優先選擇餓漢式;

發佈了39 篇原創文章 · 獲贊 46 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章