其實我們在編程過程中往往都用到了一些設計模式,只是不知道他們還有具體的名稱定義
翻閱了《設計模式之禪》後,覺得自己有必要系統地瞭解和學習一下程序設計的原則和一些常用的設計模式。
爲了加深自己的理解,在此記錄一下。
單例模式
顧名思義,就是指某一個類在程序中只會有一個實例。
爲什麼使用單例模式?
(1)節省內存
內存中始終只存在一個實例,避免了重複創建和丟棄實例造成的內存浪費
(2)節省資源
在進行IO操作的時候,通過創建一個入口防止資源的佔用
(3)統一信息
也可以直接使用Static聲明變量,單例或者Static可以確保某些變量全局統一
如何實現單例模式
(1)餓漢模式
public class SingleExample{
//一個固定的不可更改的實例
private final static SingleExample instance=new SingleExample();
//將構造函數用Private限制,使得外部無法創建實例
private SingleExample(){
System.out.println("this is creating SingleExample");
}
//獲取固定實例的方法(此方法返回的永遠是同一個實例)
public static SingleExample getInstance(){
return instance;
}
public static void say(){
System.out.println("this is SingleExample is Saying ");
}
}
(2)懶漢模式
public class SingleExample{
//本類的一個實例變量
private static SingleExample instance=null;
//將構造函數設置成Private
private SingleExample(){
System.out.println("this is creating SingleExample" );
}
//獲取實例,如果已經存在一個實例了,直接將其返回,沒有則新建一個實例
public static SingleExample getInstance(){
if(instance==null){
instance=new SingleExample();
}
return instance;
}
public static void say(){
System.out.println("this is SingleExample is Saying ");
}
}
爲什麼?
在多個線程中同時執行getInstance方法中判斷語句時,當線程1判斷得出instance=null並開始創建實例,同時在實例穿件成功前,線程2也進行了判斷,而此時instance=null,線程2也會創建一個實例。
解決
給getInstance()方法添加同步鎖(synchronized)