设计模式_创建型模式_简单工厂模式_案例

Posted fzxiaoyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式_创建型模式_简单工厂模式_案例相关的知识,希望对你有一定的参考价值。

使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,

每个几何图形都具有绘制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函数中的代码看成是上层模块,那每次有新的类都得修改其中的参数,

不符合开闭原则…代码需要做修改.

 

以上是关于设计模式_创建型模式_简单工厂模式_案例的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_工厂方法模式

设计模式 - 创建型模式_工厂方法模式

设计模式 - 创建型模式_工厂方法模式