日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設計模式-創(chuàng)建型-抽象工廠模式

 行者花雕 2020-06-25

  前一章節(jié),我們介紹了簡單工廠模式以及工廠方法模式,但是這兩種模式都存在一定的局限性,只能生產某一類型下的某一種產品,如果需求變更,同類型下出現(xiàn)了不同的產品,比如芝士披薩不僅有口味上的不同,同時存在外觀上的不同。這種時候,工廠模式顯然不再滿足要求,該怎么辦呢?于是我們想到DIP原則,它不正是為了解決這種情況而存在的嗎?接下來我們來介紹下抽象工廠模式:

  1、抽象工廠模式定義了一個interface用于創(chuàng)建相關或有依賴關系的對象簇,而無需指明具體的類。

  2、抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。

  3、從設計層面來說,抽象工廠模式就是對簡單工廠模式的改進(即進一步抽象化)

  4、將工廠抽象成兩層,抽象工廠和具體的實現(xiàn)工廠。

還是拿pizza訂購舉例,我們定義一個抽象工廠AbsFactory,由子類工廠實現(xiàn)該抽象工廠;訂購披薩OrderPizza依賴抽象,不依賴具體的實現(xiàn)。

   

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         new OrderPizza(new BJFactory());
  6     }
  7 }
  8 
  9 internal class OrderPizza
 10 {
 11     private AbsFactory factory;
 12 
 13     public OrderPizza(AbsFactory factory)
 14     {
 15         setFactory(factory);
 16         Order();
 17     }
 18 
 19     private void setFactory(AbsFactory factory)
 20     {
 21         this.factory = factory;
 22     }
 23 
 24     private void Order()
 25     {
 26         Pizza pizza = null;
 27         string orderType = "";
 28         do
 29         {
 30             Console.Write("請輸入訂購類型:");
 31             orderType = Console.ReadLine();
 32             pizza = this.factory.createPizza(orderType);
 33             if (pizza == null)
 34             {
 35                 Console.WriteLine("訂購失敗");
 36                 break;
 37             }
 38             //開始制作
 39             pizza.prepare();
 40             pizza.bake();
 41             pizza.cut();
 42             pizza.box();
 43         } while (true);
 44     }
 45 }
 46 
 47 internal interface AbsFactory
 48 {
 49     Pizza createPizza(string orderType);
 50 }
 51 
 52 internal class BJFactory : AbsFactory
 53 {
 54     public Pizza createPizza(string orderType)
 55     {
 56         Pizza pizza = null;
 57         if (orderType == "cheese")
 58         {
 59             pizza = new BJCheesePizza();
 60             pizza.setName("北京芝士披薩");
 61         }
 62         else if (orderType == "greek")
 63         {
 64             pizza = new BJGreekPizza();
 65             pizza.setName("北京希臘披薩");
 66         }
 67         return pizza;
 68     }
 69 }
 70 
 71 internal class LDFactory : AbsFactory
 72 {
 73     public Pizza createPizza(string orderType)
 74     {
 75         Pizza pizza = null;
 76         if (orderType == "cheese")
 77         {
 78             pizza = new LDCheesePizza();
 79             pizza.setName("倫敦芝士披薩");
 80         }
 81         else if (orderType == "greek")
 82         {
 83             pizza = new LDGreekPizza();
 84             pizza.setName("倫敦希臘披薩");
 85         }
 86         return pizza;
 87     }
 88 }
 89 
 90 internal abstract class Pizza
 91 {
 92     private string name;
 93 
 94     public abstract void prepare();
 95 
 96     public void bake()
 97     {
 98         Console.WriteLine($"{this.name} 烘培");
 99     }
100 
101     public void cut()
102     {
103         Console.WriteLine($"{this.name} 修剪");
104     }
105 
106     public void box()
107     {
108         Console.WriteLine($"{this.name} 打包");
109     }
110 
111     public void setName(string name)
112     {
113         this.name = name;
114     }
115 }
116 
117 internal class BJCheesePizza : Pizza
118 {
119     public override void prepare()
120     {
121         Console.WriteLine("北京的芝士披薩準備中");
122     }
123 }
124 
125 internal class BJGreekPizza : Pizza
126 {
127     public override void prepare()
128     {
129         Console.WriteLine("北京的希臘披薩準備中");
130     }
131 }
132 
133 internal class LDCheesePizza : Pizza
134 {
135     public override void prepare()
136     {
137         Console.WriteLine("倫敦的芝士披薩準備中");
138     }
139 }
140 
141 internal class LDGreekPizza : Pizza
142 {
143     public override void prepare()
144     {
145         Console.WriteLine("倫敦的希臘披薩準備中");
146     }
147 }
view code

讀過一些博主的博文以及評論,有一些理解還是蠻到位的:

  1、抽象工廠比工廠方法復雜的多,它們的目的不同。工廠方法意在延遲加載,而抽象方法意在高內聚低耦合。

  2、工廠方法模式的具體工廠類只能創(chuàng)建一個具體具體產品類的實例,而抽象工廠可以創(chuàng)建多個。

參考:https://www.runoob.com/design-pattern/abstract-factory-pattern.html

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多