單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
1.什么時候需要單實例模式?
整個類在系統運行過程中只允許一個對象,並且這個對象在整個系統的任何地方,都能夠被隨時隨地的訪問得到,並且所有的客戶訪問的都是同一個對象。
2.怎么來做呢?
三個要點:(1)你要定義一個私有化的構造函數
(2)你要定義一個私有的成員變量
(3)你要定義一個共有的get函數(所有的用戶通過這個get函數都能夠訪問到唯一的這個單實例)
單例類只能有一個實例。
單例類必須自己創建自己的唯一實例。
單例類必須給所有其他對象提供這一實例。
1.單例模式——線程安全的餓漢模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
2.單例模式——線程安全的懶漢模式
public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
//如果不加synchronized,則是線程不安全的
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
3.單例模式——線程安全的懶漢模式改進版(雙重檢查鎖)
/**
*雙重鎖:為了減少同步的開銷
*/
public class Singleton{
// 靜態可見的實例
private static volatile Singleton instance = null;
// 無參構造器
private Singleton(){
}
public Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
4.單例模式——私有的內部工廠類(線程安全)
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return SingletonFactory.Instance;
}
private static class SingletonFactory{
private static Singleton Instance = new Singleton();
}
}
//內部類也可以換成內部接口,但是工廠類變量的作用域需為public