上一篇博文中简单介绍了简单工厂模式,实现了责任分配解耦,代码复用的好处外,同时也存在着扩展性差的问题。而接下来我们对
简单工厂模式进行升级来解决这一问题:工厂方法模式
工厂方法模式UML类图:
上一篇博文的例子中,我们的车库车辆类型数目固定,一个管家就够了。但是现在我们又采购了大量的车辆,已经过于庞大,一个管家已经无法管理,
这时候我们就建立了一个小团队:总管(Factory)、商务主管(BusinessFactory)、运动主管(SportFactory)、旅游主管(OffroadFactory)。此时
我们的总管(Factory)只负责定义管理我们各个主管能做的行为,各个主管需要继承该总管的定义,根据自己的主管内容去定义操作行为。
与简单工厂模式不同之处即简单工厂模式只是将我们的具体产品类进行的抽象,并通过一个工厂类去定义具体产品的生产,实现具体产品类与客户
的解耦,同时提高了代码的复用性。但一个工厂类针对固定的产品类可以胜任,产品种类过多或不断增加的时候就会过于复杂不利于扩展。这时候我们
仿照产品类的抽象,将我们的工厂类也进一步的抽象提取,也就是我们的抽象工厂(Factory),Factory只是定义工厂的操作。具体的实现则交由具体
工厂类实现,这样就简化了我们原来复杂的工厂类,同时新增产品类型不用修改原有的工厂类,只需添加新的具体工厂类以及具体产品类就能实现,符合
开闭原则。
产品类:
1 public abstract class MyCar 2 { 3 public abstract void Driving(); 4 } 5 6 /// <summary> 7 /// 商务车 8 /// </summary> 9 public class BusinessCar : MyCar 10 { 11 public override void Driving() 12 { 13 Console.WriteLine("驾驶商务车"); 14 } 15 16 } 17 18 /// <summary> 19 /// 越野车 20 /// </summary> 21 public class OffroadCar : MyCar 22 { 23 public override void Driving() 24 { 25 Console.WriteLine("驾驶越野车"); 26 } 27 } 28 29 /// <summary> 30 /// 跑车 31 /// </summary> 32 public class SportCar : MyCar 33 { 34 public override void Driving() 35 { 36 Console.WriteLine("驾驶跑车"); 37 } 38 }
工厂类:
1 /// <summary> 2 /// 抽象工厂(总管) 3 /// </summary> 4 public abstract class Factory 5 { 6 public abstract MyCar SelectCar(); 7 } 8 9 /// <summary> 10 /// 商务车工厂(主管) 11 /// </summary> 12 public class BusinessFactory : Factory 13 { 14 public override MyCar SelectCar() 15 { 16 return new BusinessCar(); 17 } 18 } 19 /// <summary> 20 /// 跑车工厂(主管) 21 /// </summary> 22 public class SportFactory : Factory 23 { 24 public override MyCar SelectCar() 25 { 26 return new SportCar(); 27 } 28 } 29 30 /// <summary> 31 ///越野车工厂(主管) 32 /// </summary> 33 public class OffroadFactory : Factory 34 { 35 public override MyCar SelectCar() 36 { 37 return new OffroadCar(); 38 } 39 }
客户端:
1 static void Main(string[] args) 2 { 3 MyCar myCar; 4 Factory businessFactory = new BusinessFactory(); 5 myCar = businessFactory.SelectCar(); 6 myCar.Driving(); 7 8 Factory sportFactory = new SportFactory(); 9 myCar = sportFactory.SelectCar(); 10 myCar.Driving(); 11 12 13 Factory offroadFactory = new OffroadFactory(); 14 myCar=offroadFactory.SelectCar(); 15 myCar.Driving(); 16 17 Console.ReadLine(); 18 }
运行结果:
以上就是工厂方法模式的Demo,我们省去了原有的枚举,通过对工厂类的抽象规避了简单工厂模式的缺陷,很好的遵循了开闭原则,实现了
可扩展性,同时优化了软件的结构有利于处理更多复杂的问题场景,灵活性高。