首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 設計模式實戰:享元模式深度解析與文件字元共享案例

     編輯:關於.NET

模式簡介

享元模式運用共享技術有效支援大量細粒度物件。核心概念區分:

  • 內部狀態:物件內部固定、可共享的部分(不隨環境改變)
  • 外部狀態:隨環境變化、不可共享的部分(由用戶端傳入)

將外部狀態移出物件,透過共享極少數內部狀態物件,大幅減少實例數量。

適用場景

  1. 應用程式使用大量物件,造成儲存開銷過大
  2. 物件大部分狀態為外部狀態,移除後可用少量共享物件取代大量群組

結構角色

  • FlyweightFactory:建立/管理 Flyweight,提供 GetFlyweight(key),若存在則回傳既有實例
  • Flyweight:抽象介面,定義 Operation(extrinsicState)
  • ConcreteFlyweight:實作 Flyweight,儲存內部狀態
  • UnsharedConcreteFlyweight:不需共享的子類別
享元模式結構圖

基礎實作

// FlyweightFactory
public class FlyweightFactory {
    Hashtable flyweights = new Hashtable();
    public FlyweightFactory() {
        flyweights.Add("A", new ConcreteFlyweight());
        flyweights.Add("B", new ConcreteFlyweight());
        flyweights.Add("C", new ConcreteFlyweight());
    }
    public Flyweight GetFlyweight(string key) => flyweights[key] as Flyweight;
}

// Flyweight 抽象與實作
public abstract class Flyweight { public abstract void Operation(int extrinsicState); }
public class ConcreteFlyweight : Flyweight {
    public override void Operation(int s) => Console.WriteLine($"{GetType().Name}:{s}");
}
public class UnsharedConcreteFlyweight : Flyweight {
    public override void Operation(int s) => Console.WriteLine($"{GetType().Name}:{s}");
}

// Client
static void Main() {
    int state = 20;
    var factory = new FlyweightFactory();
    factory.GetFlyweight("A").Operation(--state);
    factory.GetFlyweight("B").Operation(--state);
    factory.GetFlyweight("C").Operation(--state);
    new UnsharedConcreteFlyweight().Operation(--state);
}
基礎範例執行結果

實戰案例:文件編輯器字元共享

文件 Document 中大量字元重複,僅字型大小(外部狀態)不同。結構:

  • CharacterFactory:以 Dictionary<char, Character> 快取,GetCharacter 採延遲初始化
  • Character 抽象類別:內部狀態含 symbol、width、height、ascent、descent、pointSize
  • CharacterA~CharacterZ:各字元具體類別,Display(pointSize) 顯示
文件字元共享結構
// CharacterFactory 關鍵片段
public Character GetCharacter(char key) {
    if (_characters.ContainsKey(key)) return _characters[key];
    Character c = key switch { 'A' => new CharacterA(), 'B' => new CharacterB(), /*...*/ 'Z' => new CharacterZ() };
    _characters.Add(key, c);
    return c;
}

// Client
string doc = "AAZZBBZB";
var factory = new CharacterFactory();
int pt = 10;
foreach (char c in doc) {
    factory.GetCharacter(c).Display(++pt);
}
文件案例執行結果

總結

享元模式透過內外部狀態分離與工廠快取,極大降低大量相似物件的記憶體佔用,適用於字元、圖示、棋子等大量重複細粒度物件場景。

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