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

C# 設計模式:享元模式 (5) - 咖啡廳範例:含外在狀態 (桌號) 的享元實作

     編輯:關於C語言

場景升級:咖啡廳有桌號

咖啡攤無座位 → 咖啡廳有桌號。咖啡現在擁有外在狀態 (桌號),單純享元模式不再適用,需引入外在狀態參數。

完整程式碼

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 確保相同風味只建立一個物件 (享元共享)。
  • 12 筆訂單僅建立 3 個 Flavor 物件,記憶體大幅節省。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved