???????單例模式的作用是保證整個應用程序的生命周期中,任何一個時刻,單例類的實例都只存在一個(也可以不存在)。
???????單例模式確保某一個類只有一個實例,而且自行實例化,并向整個系統提供這個實例單例模式只應在有真正的‘單一實例’需求時才可使用。
全局變量和單例模式的區別為:
- 全局變量是對一個對象的靜態引用,全局變量確實可以提供單例模式實現的全局訪問這個功能,但是它并不能保證應用程序中只有一個實例;
- 編碼規范也明確指出應該要少用全局變量,因為過多使用全局變量,會造成代碼難度;
- 全局變量并不能實現繼承(雖然單例模式在繼承上也能很好地處理,但是還可以實現繼承的)。而單例模式在類中保存了它的唯一實例,這個類它可以保證只能創建一個實例,同時它還提供了一個訪問該唯一實例的全局訪問點。
單例類的構造函數必須為私有的,同時單例類必須提供一個全局訪問點。
靜態內部類單例模式:
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
/*靜態內部類*/
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
}
???????當第一次加載Singleton類時并不會初始化instance,只有在第一次調用Singleton的getInstance方法時才會導致instance被初始化,因此第一次調用getInstance方法會導致 虛擬機加載SingletonHolder類,這種方式不僅能夠確保線程安全,也能夠保證單例對象的唯一性,同時也延遲了單例的實例化,所以這是推薦使用的單例模式實現方式。