冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 809|回覆: 0
打印 上一主題 下一主題

[心得] [C#] 設計模式 Singleton 的六種方法

[複製鏈接]

828

主題

0

好友

857

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
390967
帖子
1607
主題
828
精華
0
積分
857
楓幣
11224
威望
397
存款
10100
贊助金額
1800
推廣
0
GP
2696
閱讀權限
150
在線時間
190 小時
註冊時間
2023-5-18
最後登入
2024-11-27

2023年紀念勳章 太陽勳章 神手勳章 高級客戶 VIP會員 私服達人 懶人勳章 幼兒勳章 音樂勳章 屁孩勳章 貢獻王 性別(女) 性別(男) 積分勳章 發帖達人 2023端午節紀念勳章 富豪勳章 富可敵國 2023中秋節紀念勳章 解說達人 論壇粉絲 2023聖誕節紀念勳章 2024年紀念勳章 2024端午節紀念勳章 2024中秋節紀念勳章

跳轉到指定樓層
1
發表於 2023-5-29 13:27:26 |只看該作者 |倒序瀏覽
本帖最後由 whitefox 於 2023-5-29 13:29 編輯

討論軟體工程的設計模式中,Singleton 單一實例化模式是最常見的方法之一
這提出六種常見的實作方式

  • 非線程安全
  1. public sealed class Singleton1
  2. {
  3.     private static Singleton1 instance = null;
  4.     private Singleton1() { }
  5.     public static Singleton1 Instance
  6.     {
  7.         get
  8.         {
  9.             if (instance == null)
  10.             {
  11.                 instance = new Singleton1();
  12.             }
  13.             return instance;
  14.         }
  15.     }
  16. }
複製代碼
  • 簡單線程安全
  1. public sealed class Singleton2
  2. {
  3.     private static Singleton2 instance = null;
  4.     private static readonly object obj = new object();
  5.     private Singleton2() { }
  6.     public Singleton2 Instance
  7.     {
  8.         get
  9.         {
  10.             lock (obj)
  11.             {
  12.                 if (instance == null)
  13.                 {
  14.                     instance = new Singleton2();
  15.                 }
  16.                 return instance;
  17.             }
  18.         }
  19.     }
  20. }
複製代碼
  • Double-Check-Locking 線程安全
  1. public sealed class Singleton3
  2. {
  3.     private static Singleton3 instance = null;
  4.     private static object obj = new object();
  5.     private Singleton3() { }
  6.     public static Singleton3 Instance
  7.     {
  8.         get
  9.         {
  10.             if (instance == null)
  11.             {
  12.                 lock (obj)
  13.                 {
  14.                     if (instance == null)
  15.                     {
  16.                         instance = new Singleton3();
  17.                     }
  18.                 }
  19.             }
  20.             return instance;
  21.         }
  22.     }
  23. }
複製代碼
  • 不加 Locking 線程安全/簡單 Lazy Type
  1. public sealed class Singleton4
  2. {
  3.     private static readonly Singleton4 instance = new Singleton4();
  4.     /// <summary>
  5.     /// 顯式的靜態構造函數用來告訴 C# 編譯器在其内容實例化之前不要標註其類型
  6.     /// </summary>
  7.     static Singleton4() { }
  8.     private Singleton4() { }
  9.     public static Singleton4 Instance { get { return instance; } }
  10. }
複製代碼
  • 完整 Lazy Type
  1. public sealed class Singleton5
  2. {
  3.     private Singleton5() { }
  4.     public static Singleton5 Instance { get { return Nested.instance; } }
  5.     private class Nested
  6.     {
  7.         static Nested() { }
  8.         internal static readonly Singleton5 instance = new Singleton5();
  9.     }
  10. }
複製代碼
  • .NET 4 的 Lazy Type
  1. public sealed class Singleton6
  2. {
  3.     private static readonly Lazy<Singleton6> lazy =
  4.            new Lazy<Singleton6>(()=> new Singleton6());
  5.     public static Singleton6 Instance { get { return lazy.Value; } }
  6.     private Singleton6() { }
  7. }
複製代碼
基本上方法1太過脆弱之外,其他實現方式應該在考量程式效能與執行時是否需要更早使用到類別中的靜態成員來抉擇實現方式
其他方法綜合比較下
方法2是比較容易編寫且加鎖執行也不會太慢
方法3與方法5的效能會受影響,但在構造函數不複雜下仍是建議的方法
方法4是效能與安全兼具的實作方法,但有比類別實例化更早應用的靜態成員,就不適合

個人經驗是使用方法3為主
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-28 04:24

回頂部