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

C# 設計模式:享元模式 (4) - 咖啡攤範例:純享元模式 (無外在狀態)

     編輯:關於C語言

場景:咖啡攤無座位

客人自取咖啡離開,咖啡只有內在狀態 (風味),無環境因素 (外在狀態)。適合純享元模式:每種風味只建立一個物件共享。

完整程式碼

using System;
using System.Collections;

public abstract class Order
{
    public abstract void Serve();
    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() => Console.WriteLine("Serving 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 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();
        ordersMade++;
    }
}

關鍵點

  • Flavor 封裝風味 (內在狀態),Serve() 無參數。
  • FlavorFactory 以 Hashtable 快取,相同鍵值回傳同一實例。
  • 12 杯咖啡、3 種風味 → 僅 3 個 Flavor 物件,完美示範享元共享。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved