目錄
- 第一章 單例模式介紹
- 第二章 01-餓漢式(第一種)
- 第三章 02-餓漢式(第二種)
- 第四章 03-懶漢式(第一種)
- 第五章 04-懶漢式(第二種)
- 第六章 05-雙檢鎖(推薦用)
- 第七章 06-登記式(推薦用)
- 第八章 07-列舉式(推薦用)
- 第九章 單例模式應用
專案地址:https://gitee.com/caochenlei/design-pattern
第一章 單例模式介紹
單例模式的介紹:
單例模式(Singleton Pattern)是最簡單的設計模式之一,這種型別的設計模式屬于創建型模式,通過單例模式的方法創建的類在當前行程中只有一個實體,
一般情況下,不建議使用懶漢式,建議使用餓漢式,只有在要明確實作 lazy loading 效果時,才會使用登記式,如果涉及到反序列化創建物件時,可以嘗試使用列舉式,如果有其他特殊的需求,可以考慮使用雙檢鎖方式,
單例模式的優點:
- 單例模式可以保證記憶體里只有一個實體,減少了記憶體的開銷,
- 可以避免對資源的多重占用,
- 單例模式設定全域訪問點,可以優化和共享資源的訪問,
單例模式的缺點:
- 單例模式一般沒有介面,擴展困難,如果要擴展,則除了修改原來的代碼,沒有第二種途徑,違背開閉原則,
- 在并發測驗中,單例模式不利于代碼除錯,在除錯程序中,如果單例中的代碼沒有執行完,也不能模擬生成一個新的物件,
- 單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則,
單例模式的場景:
- 創建的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連接等,
- WEB 中的計數器,不用每次重繪都在資料庫里加一次,用單例先快取起來,
第二章 01-餓漢式(第一種)
描述:執行緒很安全,沒有鎖機制,執行效率高,類加載初始化,可能浪費記憶體,這個可以用到實際生產環境,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//餓漢式
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態變數物件
private final static Singleton instance = new Singleton();
//向外部提供一個公開獲取方法
public static Singleton getInstance() {
return instance;
}
}
第三章 02-餓漢式(第二種)
描述:執行緒很安全,沒有鎖機制,執行效率高,類加載初始化,可能浪費記憶體,這個可以用到實際生產環境,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//餓漢式
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態變數物件
private final static Singleton instance;
//在靜態代碼塊中初始化該物件
static {
instance = new Singleton();
}
//向外部提供一個公開獲取方法
public static Singleton getInstance() {
return instance;
}
}
第四章 03-懶漢式(第一種)
描述:執行緒不安全,沒有鎖機制,執行效率高,類用時初始化,不會浪費記憶體,這個不建議用到實際生產環境,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//懶漢式
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態變數物件
private static Singleton instance;
//向外部提供一個公開獲取方法
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
第五章 04-懶漢式(第二種)
描述:執行緒很安全,擁有方法鎖,執行效率慢,類用時初始化,不會浪費記憶體,這個不建議用到實際生產環境,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//懶漢式
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態變數物件
private static Singleton instance;
//向外部提供一個公開獲取方法
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
第六章 05-雙檢鎖(推薦用)
描述:這種方式采用雙檢鎖機制,類用時初始化,執行緒安全且在多執行緒情況下能保持高性能,實作方式略微復雜,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//雙檢鎖(雙重校驗鎖)
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態變數物件
private static Singleton instance;
//向外部提供一個公開獲取方法
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
第七章 06-登記式(推薦用)
描述:這種方式采用靜態內部類,類用時初始化,執行緒安全且在多執行緒情況下能保持高性能,實作方式比較一般,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//登記式(靜態內部類)
class Singleton {
//私有構造方法,防止外部new
private Singleton() {}
//提供一個私有的靜態內部類
private static class SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
}
//向外部提供一個公開獲取方法
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
第八章 07-列舉式(推薦用)
描述:執行緒很安全,沒有鎖機制,執行效率高,類加載初始化,但是這種實作方式還沒有被廣泛采用,自動支持序列化機制,絕對防止多次實體化,
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.INSTANCE;
Singleton singleton2 = Singleton.INSTANCE;
System.out.println(singleton1 == singleton2);
}
}
//列舉類
enum Singleton {
INSTANCE
}
第九章 單例模式應用
最佳實踐:java.lang.Runtime

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265664.html
標籤:java
上一篇:普歌-允異團隊-java做小成果
