1. 程式人生 > >設計模式_創建型模式_簡單工廠模式_案例

設計模式_創建型模式_簡單工廠模式_案例

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 = new
SphereTool(); 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函數中的代碼看成是上層模塊,那每次有新的類都得修改其中的參數,

不符合開閉原則…代碼需要做修改.

設計模式_創建型模式_簡單工廠模式_案例