首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 全局共享對象管理:單例模式替代幾十個靜態類

     編輯:程式設計綜合問答

場景

幾十個全局對象,共有 3 屬性 2 方法,各有獨有屬性/方法。需程序啟動初始化,全局可訪問,避免窗口間傳遞參數。

方案:單例管理器 + 基類繼承


// 基類
public abstract class BaseCtrl {
    public string XName { get; set; }
    public void DoCommon() { ... }
}

// 具體類
public class Ctrl1 : BaseCtrl { public string PropA { get; set; } }
public class Ctrl2 : BaseCtrl { public int PropB { get; set; } }

// 單例管理器
public sealed class CtrlManager {
    private static readonly Lazy<CtrlManager> _instance = new Lazy<CtrlManager>(() => new CtrlManager());
    public static CtrlManager Instance => _instance.Value;

    public Ctrl1 Ctrl1 { get; } = new Ctrl1 { XName = "name1" };
    public Ctrl2 Ctrl2 { get; } = new Ctrl2 { XName = "name2" };
    // ... 幾十個屬性

    private CtrlManager() {
        // 統一初始化邏輯
        foreach (var ctrl in GetAllCtrls()) ctrl.DoCommon();
    }

    private IEnumerable<BaseCtrl> GetAllCtrls() {
        yield return Ctrl1;
        yield return Ctrl2;
        // ...
    }
}

// 任何窗口使用
CtrlManager.Instance.Ctrl1.DoCommon();
CtrlManager.Instance.Ctrl2.PropB = 100;

優勢

  • 懶加載線程安全:Lazy<T> 保證單例唯一性。
  • 強類型訪問:CtrlManager.Instance.Ctrl1 智能提示,避免字符串鍵誤寫。
  • 集中初始化:構造函數統一調用公共方法。
  • 擴展性:新增對象只需在管理器加屬性,不影響現有代碼。

替代:DI 容器

若專案已用 Autofac/Unity/MS DI,註冊為 SingleInstance(),構造函數注入即可,更符合現代架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved