咖啡攤無座位 → 咖啡廳有桌號。咖啡現在擁有外在狀態 (桌號),單純享元模式不再適用,需引入外在狀態參數。
using System;
using System.Collections;
public abstract class Order
{
public abstract void Serve(Table table); // 外在狀態由參數傳入
public abstract string GetFlavor();
}
public class Flavor : Order
{
private string flavor; // 內在狀態
public Flavor(string f) => flavor = f;
public override string GetFlavor() => flavor;
public override void Serve(Table t) => Console.WriteLine($"Serving table {t.Number} with flavor {flavor}");
}
public class FlavorFactory
{
Hashtable flavors = new Hashtable();
public Order GetOrder(string key)
{
if (!flavors.ContainsKey(key)) flavors.Add(key, new Flavor(key));
return (Order)flavors[key];
}
public int GetTotalFlavorsMade() => flavors.Count;
}
public class Table // 外在狀態封裝
{
public int Number { get; }
public Table(int n) => Number = n;
}
public class Client
{
static FlavorFactory factory = new FlavorFactory();
static int ordersMade = 0;
static void Main()
{
TakeOrder("Black Coffee");
TakeOrder("Capucino");
TakeOrder("Espresso");
TakeOrder("Capucino");
TakeOrder("Espresso");
TakeOrder("Black Coffee");
TakeOrder("Espresso");
TakeOrder("Espresso");
TakeOrder("Black Coffee");
TakeOrder("Capucino");
TakeOrder("Capucino");
TakeOrder("Black Coffee");
Console.WriteLine($"\nTotal Orders: {ordersMade}");
Console.WriteLine($"Total Flavor Objects: {factory.GetTotalFlavorsMade()}");
}
static void TakeOrder(string f)
{
Order o = factory.GetOrder(f);
o.Serve(new Table(++ordersMade)); // 每單新桌號
ordersMade++;
}
}
Flavor 只保存內在狀態 (風味名稱),Serve(Table) 接收外在狀態 (桌號)。FlavorFactory 確保相同風味只建立一個物件 (享元共享)。Flavor 物件,記憶體大幅節省。