public class PizzaA : Pizza { public void DoPizza() { Console.WriteLine("pizza A"); } }
public class PizzaB : Pizza { public void DoPizza() { Console.WriteLine("pizza B"); } } public static class SimplePizzaFacotry { public static Pizza Create(string type) { if (type == "PizzaA") return new PizzaA(); else return new PizzaB(); } }
// Usage public class SimplePizzaFacotryOrder { public void OrderPizza() { Pizza pizza = SimplePizzaFacotry.Create("PizzaA"); pizza.DoPizza(); } }
代碼 class PizzaBD { public string Dough { get; set; } public string Sauce { get; set; } public string Topping { get; set; } }
abstract class PizzaBuilder { public PizzaBD pizza { get; protected set; }
public void CreatePizza() { pizza = new PizzaBD(); }
public abstract void BuildDough(); public abstract void BuildSauce(); public abstract void BuildTopping(); }
class HawaiianPizzaBuilder : PizzaBuilder { public override void BuildDough() { pizza.Dough = "Cross"; }
public override void BuildSauce() { pizza.Sauce = "Mild"; }
public override void BuildTopping() { pizza.Topping = "Ham+Pineapple"; } }
class SpicyPizzaBuilder : PizzaBuilder { public override void BuildDough() { pizza.Dough = "Pan Baked"; }
public override void BuildSauce() { pizza.Sauce = "Hot"; }
public override void BuildTopping() { pizza.Topping = "Pepperoni+Salami"; } }
class Cook { public PizzaBuilder PizzaBuilder { get; set; }
public PizzaBD Pizza { get { return PizzaBuilder.pizza; } }
public void MakePizza() { PizzaBuilder.CreatePizza(); PizzaBuilder.BuildDough(); PizzaBuilder.BuildSauce(); PizzaBuilder.BuildTopping(); } }
// usage public class CallBuilder { public void OrderPizza() { Cook cook = new Cook(); cook.PizzaBuilder = new SpicyPizzaBuilder(); cook.MakePizza(); cook.PizzaBuilder = new HawaiianPizzaBuilder(); cook.MakePizza(); } }
5. Facade Pattern 外觀模式
提到了Builder模式,也就順便提一下Facade模式。兩者類似處在于都是建立一系列對象,區別在于Builder模式創建一系列有依賴關系的子類,而Facade模式則是建立一個將復雜的子類簡化和集中化的通道。還是以Pizza為例,客戶吃完付款,需要Waiter收取現金/卡,然后財務做賬/transfer之后打印發票,返回。對客戶來說后端多的一系列動作他并不關心,PizzaPayFacade提供給客戶一個Pay方法,方法里面完成這一系列的動作[可能包括類的實現]。代碼稍后提供。大家可以先參考First We try, then we trust的Facade說明的代碼示例 http://m.survivalescaperooms.com/zhenyulu/articles/55992.html