使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,
每个几何图形都具有绘制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函数中的代码看成是上层模块,那每次有新的类都得修改其中的参数,
不符合开闭原则…代码需要做修改.