1. 程式人生 > >單例模式的理解及應用

單例模式的理解及應用

單例模式

單例模式定義:定義:確保某個類只有一個例項,而且自行例項化提供給外部使用。 單例模式有很中比較常用的有懶漢模式和餓漢模式。注:我在網上查說的比較多的模式,在專案中比較常看到的有懶漢模式。餓漢模式沒怎麼看過。

懶漢模式:

public class SingleTon {
    //宣告私有化
    private static SingleTon singleTonInstance;
    //將建構函式私有化
    private SingleTon() {
    }
    //懶漢式
    private static synchronized SingleTon getInstance
(){ if (null==singleTonInstance){ singleTonInstance = new SingleTon(); } return singleTonInstance; } }

優點:用到的時候才會去例項化,在一定程度上節約了資源。

缺點:getInstance方法是用synchronized修飾的,該方法是同步的,為了保證執行緒安全,但是導致每次呼叫該方法的時候都會被同步,這樣會消耗不必要的資源(不必要的同步開銷)。所以這種模式一般不建議使用。。

餓漢模式:

public
class SingleTon { //將建構函式私有化 private SingleTon() { } //建立私有例項物件 private static final SingleTon singleTonInstance = new SingleTon(); //對外提供方法,返回例項物件 public static SingleTon getInstance() { return singleTonInstance; }

優點:簡單,執行緒安全。

缺點:例項物件是static的,在宣告的時候就例項化了,浪費資源。 PS:還有一個雙重鎖定模式就是在懶漢模式新增一層synchronized。例項控制:Singln 會阻止其他物件例項化其自己的 Singln 物件的副本,從而確保所有物件都訪問唯一例項 靈活性:因為類控制了例項化過程,所以類可以更加靈活修改例項化過程

總結

在單例模式中構造方法必須寫的,而且構造方法必須去私有化。因為單例模式只會去例項化一次,不寫構造方法在java中會預設生成一個共有的構造方法。那樣的話就不是單例模式了。在構造方法中儘量不要去初始化引數,可以寫init方法代替進行初始化。構造方法初始化值會很麻煩(聽說的)。餓漢模式使用大多數情況是在多執行緒的情況下去使用的。 單例模式呼叫方法:類.getInstance().方法。