什麼是單例?
單例的意思是一個類永遠只存在一個對象, 不能創建多個對象。
爲什麼要用單例?
開發中有很多類的對象我們只需要一個, 例如虛擬機對象、任務管理器對象
對象越多越佔內存,有些時候只需要一個對象 就可以實現業務,單例可以節約內存,提高性能。
如何實現單例?
餓漢單例設計模式:
通過類獲取單例對象的時候,對象已經提前做好了
實現步驟:
- 定義一個單例類
- 把類的構造器私有
- 定義一個靜態成員變量用於存儲一個對象
(餓漢單例在返回對象的時候,對象要已經做好,所以這裏直接創建出來) - 定義一個方法返回單例對象
public class SingleInstanceDemo1 {
public static void main(String[] args) {
SingleInstance01 s1 = SingleInstance01.getInstance();
SingleInstance01 s2 = SingleInstance01.getInstance();
System.out.println(s1 == s2);//true
}
}
//餓漢單例設計一個單例類
class SingleInstance01{
//2.定義一個靜態成員變量存儲一個對象
//餓漢單例需要提前把對象創建好
public static SingleInstance01 ins = new SingleInstance01();
//1.私有構造器,構造器只能在本類使用
private SingleInstance01(){}
//3.提供一個方法返回單例對象
public static SingleInstance01 getInstance(){
return ins;
}
}
懶漢單例設計模式:
通過類獲取單例對象的時候發現沒有對象纔會去創建一個對象。
實現步驟:
- 定義一個單例類
- 把類的構造器私有
- 定義一個靜態成員變量用於存儲一個對象
( 懶漢單例不能直接創建對象,必須雷要的時候才創建) - 定義一個方法返回單例對象,判斷對象不存在才創建一次, 存在直接返回
public class SingleInstanceDemo2 {
public static void main(String[] args) {
SingleInstance02 s1 = SingleInstance02.getInstance();
SingleInstance02 s2 = SingleInstance02.getInstance();
System.out.println(s1 == s2);//true
}
}
//懶漢單例設計一個單例類
class SingleInstance02{
//2.定義一個靜態成員去存儲對象
//不能直接創建對象,需要再創建
public static SingleInstance02 ins;
//1.構造器私有
private SingleInstance02(){};
//3.返回對象
public static SingleInstance02 getInstance(){
if (ins == null){
//1.第一次去對象。創建一個對象
ins = new SingleInstance02();
}
return ins;
}
}