單例模式(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對象,引發錯誤;其次一點區別在於懶漢式屬於時間換空間,餓漢式屬於時間換空間,故優先選擇餓漢式;