單例模式可以說是一種程序猿耳聞能詳的設計模式之一了。基本上所有的商業項目都會使用到它。那麼單例模式到底是什麼?它的作用又是什麼呢?在瞭解了它的本質、作用之後我們又應該如何實現它,優化它呢?
在實際開發中,由於邏輯需求,某些類在整個項目中只需要一個實例對象,並且它會被多次使用。這個時候我們就會考慮使用單例模式來實現這個類。單例模式的特點是:
1、在項目中只能存在一個實例。
2、單例類必須創建自己的唯一實例並且給其他類提供這個實例。
單例模式的作用很明確,它能夠避免實例對象的重複創建,不僅可以減少每次創建對象的時間開銷,還可以節約內存空間;能夠避免由於操作多個實例導致的邏輯錯誤。
單例模式實現方式有很多,下面我爲大家簡單的介紹4中實現方式:餓漢模式、懶漢模式(線程不安全)、雙重檢查模式、靜態內部類實現。
餓漢模式:
public class Singleton {
private static Singleton singleton = new Singleton();
/**
* 必須私有化構造函數 讓外部不能通過 new 來實例對象
*/
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
懶漢模式(線程不安全):
public class Singleton {
private static Singleton singleton;
/**
* 必須私有化構造函數 讓外部不能通過 new 來實例對象
*/
private Singleton() {
}
public static Singleton getInstance() {
if (null==singleton){
singleton=new Singleton();
}
return singleton;
}
}
雙重檢查模式:
public class Singleton {
private static volatile Singleton singleton;
/**
* 必須私有化構造函數 讓外部不能通過 new 來實例對象
*/
private Singleton() {
}
public static Singleton getInstance() {
if (null == singleton) {
synchronized (Singleton.class) {
if (null == singleton) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
靜態內部類單例模式:
public class Singleton {
/**
* 必須私有化構造函數 讓外部不能通過 new 來實例對象
*/
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.singleton;
}
private static class SingletonHolder {
private static final Singleton singleton = new Singleton();
}
}
使用靜態內部類單例模式不僅可以保證線程安全(資源消耗低),同時也能保證實例對象的唯一性。推薦使用這種方式實現單例模式。
其它還有一些實現方式這裏就不一一列舉了。希望這篇文章可以給大家一點借鑑作用。