一、工厂方法:简单工厂违背了单一职责原则,而且不利于扩展,于是衍生了工厂方法模式,该模式能很好地解决对扩展开放、对修改关闭的需求。
二、实现思路 :对每一个对象都创建一个对应的工厂类,对对象和工厂类都进行抽象,让上端尽量依赖抽象。
三、代码举例:
抽象汽车类Car:
namespace FactoryMethod { public abstract class Car { public abstract void Drive(); } }
抽象工厂类Factory:
namespace FactoryMethod { public interface Factory { Car CreateInstance(); } }
奔驰汽车类BenChiCar:
namespace FactoryMethod { public class BenChiCar:Car { public override void Drive() { Console.WriteLine("奔驰汽车行驶中!"); } } }
宝马汽车类BaomaCar:
namespace FactoryMethod { public class BaomaCar : Car { public override void Drive() { Console.WriteLine("宝马汽车行驶中!"); } } }
大众汽车类DazongCar:
namespace FactoryMethod { public class DazongCar:Car { public override void Drive() { Console.WriteLine("大众汽车行驶中!"); } } }
奔驰汽车工厂类BenChiFactory:
namespace FactoryMethod { public class BenChiFactory : Factory { public Car CreateInstance() { Console.WriteLine("创建了奔驰汽车!"); return new BenChiCar(); } } }
宝马汽车工厂类BaomaFactory:
namespace FactoryMethod { public class BaomaFactory : Factory { public Car CreateInstance() { Console.WriteLine("创建了宝马汽车!"); return new BaomaCar(); } } }
大众汽车工厂类DazongFactory:
namespace FactoryMethod { public class DazongFactory : Factory { public Car CreateInstance() { Console.WriteLine("创建了大众汽车!"); return new DazongCar(); } } }
客户类:
{ //工厂方法,一个对象对应一个工厂,之所以这么做,是为了将对象的创建逻转移给工厂类(对象的创建有可能很复杂,这样做减少了客户端对创建对象所需的资源的依赖),而且新增对象时不需要修改原来的类,只需增加对象和创建对象的工厂即可,遵循了对扩展开放,对修改关闭的原则。 FactoryMethod.Factory Dazongfac = new FactoryMethod.DazongFactory(); Car Dazong = Dazongfac.CreateInstance(); Dazong.Drive(); FactoryMethod.Factory Benchifac = new FactoryMethod.BenChiFactory(); Car Benchi = Benchifac.CreateInstance(); Benchi.Drive(); FactoryMethod.Factory Baomafac = new FactoryMethod.BaomaFactory(); Car Baoma = Baomafac.CreateInstance(); Baoma.Drive(); Console.ReadKey(); }
运行结果:
四、工厂方法的优缺点及应用:把对象创建的逻辑细节交给了工厂类,上端不需要关心创建对象需要的业务逻辑信息,但是增加了代码的复杂度 ;比起简单工厂能更好的进行扩展,需要增加对象时只需要增加一个对象和创建对象的工厂即可,不用修改原来的类,遵循了开闭原则,适用于创建复杂的对象,简单对象的创建没必要使用工厂方法模式。