設計模式_創建型模式_簡單工廠模式_案例
阿新 • • 發佈:2018-03-09
else ron 結果 exception mes 靜態方法 不存在 圖形 而且
使用簡單工廠模式設計一個可以創建不同幾何形狀(如圓形、方形和三角形等)的繪圖工具,
每個幾何圖形都具有繪制draw()和擦除erase()兩個方法,
要求在繪制不支持的幾何圖形時,提示一個UnSupportedShapeException。
結構圖如下:
AbstractDrawTools 所有繪圖工具的基類,是個抽象工廠類,抽取了三個繪圖工具的共有方法Draw() Erase()當成抽象方法
這裏簡化了工廠類,把工廠類中的創建對象的靜態方法移植到這個類中.
CaspuleTool 膠囊繪圖工具類
SphereTool 球形繪圖工具類
CubeTool 立方體繪圖工具類
這三個工具類實現基類的二個抽象方法,而且還可以在類中寫特有的一些方法或者屬性
Program 這是控制臺應用程序入口類,在main函數中去調用AbstractDrawTools中的GetDrawTool方法,傳遞指定工具名稱,
返回一個繪圖工具對象.如果工具名稱對應的工具類不存在,返回Null,輸出提示UnSupportedShapeException.
具體代碼如下:
AbstractDrawTools
1 namespace SimpleFactory 2 { 3 /// <summary> 4 /// 所有繪圖工具類的基類 5 /// </summary>6 abstract class AbstractDrawTools 7 { 8 //通過繪圖工具名稱,返回一個繪圖工具 9 public static AbstractDrawTools GetDrawTool(string drawToolName) 10 { 11 AbstractDrawTools drawTool = null; 12 switch (drawToolName) 13 { 14 case "球形": drawTool = newSphereTool(); break; 15 case "立方體": drawTool = new CubeTool(); break; 16 case "膠囊體": drawTool = new CapsuleTool();break; 17 default: break; 18 } 19 20 return drawTool; 21 } 22 23 public abstract void Draw(); 24 public abstract void Erase(); 25 } 26 }
CaspuleTool
1 namespace SimpleFactory 2 { 3 /// <summary> 4 /// 膠囊體繪圖類 5 /// </summary> 6 class CapsuleTool : AbstractDrawTools 7 { 8 public override void Draw() 9 { 10 Console.WriteLine("繪制膠囊體"); 11 } 12 13 public override void Erase() 14 { 15 Console.WriteLine("擦除膠囊體"); 16 } 17 } 18 }
SphereTool
1 namespace SimpleFactory 2 { 3 /// <summary> 4 /// 球形繪圖類 5 /// </summary> 6 class SphereTool : AbstractDrawTools 7 { 8 public override void Draw() 9 { 10 Console.WriteLine("繪制球形"); 11 } 12 13 public override void Erase() 14 { 15 Console.WriteLine("擦除球形"); 16 } 17 } 18 }
CubeTool
1 namespace SimpleFactory 2 { 3 /// <summary> 4 /// 立方體繪圖類 5 /// </summary> 6 class CubeTool : AbstractDrawTools 7 { 8 public override void Draw() 9 { 10 Console.WriteLine("繪制立方體"); 11 } 12 13 public override void Erase() 14 { 15 Console.WriteLine("擦除立方體"); 16 } 17 } 18 }
Program
1 namespace SimpleFactory 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //通過抽象繪圖工廠類得到一個球形工具 8 AbstractDrawTools drawTool = AbstractDrawTools.GetDrawTool("球形"); 9 10 if (drawTool != null) 11 { 12 //調用其中的方法進行繪制和擦除 13 drawTool.Draw(); 14 drawTool.Erase(); 15 } 16 Console.WriteLine("**********************"); 17 //通過抽象繪圖工廠類得到一個膠囊工具 18 drawTool = AbstractDrawTools.GetDrawTool("膠囊體"); 19 if (drawTool != null) 20 { 21 drawTool.Draw(); 22 drawTool.Erase(); 23 } 24 Console.WriteLine("**********************"); 25 //如果傳遞不存在的繪圖工具,就返回一個空對象 26 drawTool = AbstractDrawTools.GetDrawTool("圓柱形"); 27 if (drawTool == null) 28 { 29 Console.WriteLine("UnSupportedShapeException"); 30 } 31 else 32 { 33 drawTool.Draw(); 34 drawTool.Erase(); 35 } 36 37 Console.Read(); 38 } 39 } 40 }
輸出結果:
總結:
使用簡單工廠模式後,當需要增加新的繪圖工具類,需要做如下改動:
1. 添加新的繪圖類.
2. 修改AbstractDrawTools類的邏輯代碼,對新的繪圖類進行判斷
3.修改main函數調用GetDrawTool()方法時傳遞的參數
這裏把main函數中的代碼看成是上層模塊,那每次有新的類都得修改其中的參數,
不符合開閉原則…代碼需要做修改.
設計模式_創建型模式_簡單工廠模式_案例