結構性程式碼 (可編譯)
using System;
using System.Collections;
class FlyweightFactory
{
Hashtable flyweights = new Hashtable();
public FlyweightFactory()
{
flyweights.Add("X", new ConcreteFlyweight());
flyweights.Add("Y", new ConcreteFlyweight());
flyweights.Add("Z", new ConcreteFlyweight());
}
public Flyweight GetFlyweight(string key) => (Flyweight)flyweights[key];
}
abstract class Flyweight
{
public abstract void Operation(int extrinsicState);
}
class ConcreteFlyweight : Flyweight
{
string intrinsicState = "A"; // 內在狀態
public override void Operation(int extrinsicState)
=> Console.WriteLine($"ConcreteFlyweight: intrinsic {intrinsicState}, extrinsic {extrinsicState}");
}
public class Client
{
static void Main()
{
int extrinsic = 22;
FlyweightFactory f = new FlyweightFactory();
Flyweight fx = f.GetFlyweight("X"); fx.Operation(--extrinsic);
Flyweight fy = f.GetFlyweight("Y"); fy.Operation(--extrinsic);
Flyweight fz = f.GetFlyweight("Z"); fz.Operation(--extrinsic);
}
}
執行流程
- Client 建立 Factory,取得 X/Y/Z 三個享元 (實際僅 3 實例)。
- 每次呼叫
Operation(extrinsicState) 傳入外在狀態 (遞減 22→21→20)。
- 享元物件輸出內在狀態 "A" 與當前外在狀態,驗證共享與外在狀態分離。