前言
設計模式介紹,以飲料店為實例來實現工廠模式的情境
工廠模式是很常見的設計模式,簡單工廠模式有一個工廠,由工廠專門負責製造使用者需要的商品,商品主要是呈現有哪些功能和特性,就以飲料店為例子來實作工廠模式
實作簡單工廠模式
流程介紹
1.首先我們要有一個主商品模型
2.其他次商品繼承主商品的特性在另外擴充(extend)其他特性(Property)
3.工廠接收客戶(client)需求
4.產出客戶所要的商品
程式碼呈現
主商品模型
1 2 3 4 5 6 7 8 9 10 11
| public interface IProduct { string Name { get; } int Accoumt{get;} string Size{get;} string Ice{get;} string Sugar { get; } void doclientproduct(int accoumt, string size, string ice,string sugar=""); void doproduct(); void info(); }
|
次商品繼承主商品模型
商品(一)茶類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| class tea:IProduct { private int accoumt; private string size; private string ice; private string sugar; private string name; public tea(){} public tea(string name) { Name = name; } public int Accoumt { get { return accoumt; } set { accoumt = value; } } public string Size { get { return size; } set { size = value; } } public string Ice { get { return ice; } set { ice = value; } } public string Sugar { get { return sugar; } set { sugar = value; } } public string Name { get { return name; } set { name = value; } } public void doclientproduct(int accoumt, string size, string ice, string sugar) { Accoumt = accoumt; Size = size; Ice= ice; Sugar = sugar; } public void doproduct() { Accoumt = 1; Size = "M"; Ice = "正常"; Sugar = "正常"; } public void info() { Console.WriteLine(name+" 尺寸:" + size + ",冰塊:" + ice +",甜度:" +sugar+",數量:" + accoumt); }
}
|
商品(二) 水果類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| class fruit:IProduct { private int accoumt; private string size; private string ice; private string sugar; private string name; public fruit(string name) { Name = name; } public int Accoumt { get{return accoumt;} set{accoumt = value;} } public string Size { get{return size;} set{size = value;} } public string Ice { get {return ice;} set{ice = value;} } public string Name { get{return name;} set{name = value;} } public string Sugar { get{return sugar;} set { if(value=="無糖") sugar = value; } } public void doclientproduct(int accoumt, string size, string ice, string sugar="") { Accoumt = accoumt; Size = size; Ice= ice; Sugar = "無糖"; } public void doproduct() { Accoumt = 1; Size = "M"; Ice = "正常"; Sugar = "無糖"; } public void info() { Console.WriteLine(name + " 尺寸:" + size + ",冰塊:" + ice + ",甜度:" + sugar + ",數量:" + accoumt); } }
|
簡單工廠
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Factory { public IProduct createproduct(string type,string name) { if (type == "茶類") { return new tea(name); } else if (type == "水果類") { return new fruit(name); }
return null; } }
|
接收客戶需求
1 2 3 4 5 6 7 8 9 10 11
| static void Main(string[] args) { Factory store = new Factory(); var client1 = store.createproduct("茶類","紅茶"); var client2 = store.createproduct("水果類", "蘋果汁"); client1.doproduct(); client2.doclientproduct(1,"M","正常"); client1.info(); client2.info(); Console.ReadLine(); }
|
顯示結果
結語
優點:
1.工廠含必要的邏輯判斷,可以決定在什麼時候創建哪一個產品的實例,客戶端可以免除直接創建產品對象的責任。
2.可以減少使用者的記憶量。
3.可以在不修改客戶端資料的情況下,變更或新增具體產品,提高了系統的靈活性。
缺點:
1.工廠集中所有產品的創建邏輯,一旦無法正常使用,整個系統都受影響。
2.系統擴展困難,一旦增加新產品就不得不修改工廠邏輯,而在產品多的情況下,可能造成工廠邏輯複雜,不利於系統的擴展與維護。