比如有大学生和社区资源者以雷锋的名义去帮助老人做事情。
雷锋类:
namespace ConsoleApp1 { /// <summary> /// 雷锋类,定义工厂方法所创建的对象的接口 /// </summary> class LeiFeng { public void Sweep() { Console.WriteLine("扫地"); } public void Wash() { Console.WriteLine("洗衣"); } public void BuyRice() { Console.WriteLine("买米"); } } }
学雷锋做事的大学生:
namespace ConsoleApp1 { /// <summary> /// 学雷锋的大学生 /// </summary> class Undergraduate:LeiFeng { } }
学雷锋做事的社区自愿者:
namespace ConsoleApp1 { /// <summary> /// 学雷锋的社区志愿者 /// </summary> class Volunteer :LeiFeng { } }
简单工厂类:
namespace ConsoleApp1 { /// <summary> /// 简单雷锋工厂类 /// </summary> class SimpleFactory { public static LeiFeng CreateLeiFeng(string type) { LeiFeng result = null; switch (type) { case "学雷锋的大学生": result = new Undergraduate(); break; case "社区志愿者": result = new Volunteer(); break; } return result; } } }
客户端代码:
namespace ConsoleApp1 { class Program { static void Main(string[] args) { //简单工厂模式,这里有三句重复的代码 LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentA.BuyRice(); LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentB.Sweep(); LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentC.Wash(); } } }
再用工厂方法模式写一遍,创建雷锋工厂:
namespace ConsoleApp1 { //雷锋工厂,声明工厂方法,该方法返回一个雷锋类型的对象 interface IFactory { LeiFeng CreateLeiFeng(); } } namespace ConsoleApp1 { //学雷锋的大学生工厂 class UndergraduateFactory : IFactory { public LeiFeng CreateLeiFeng() { return new Undergraduate(); } } } namespace ConsoleApp1 { //学雷锋的社区志愿者工厂 class VolunteerFactory : IFactory { public LeiFeng CreateLeiFeng() { return new Volunteer(); } } }
客户端调用:
namespace ConsoleApp1 { class Program { static void Main(string[] args) { //工厂方法模式 IFactory factory = new UndergraduateFactory(); LeiFeng student = factory.CreateLeiFeng(); student.BuyRice(); student.Sweep(); student.Wash(); Console.ReadLine(); } } }
工厂方法是简单工厂的进一步抽象和推广。工厂方法克服了简单工厂违背开放——封闭原则的缺点,即如果还要添加一个学雷锋的xx对象工厂,就要在工厂类的方法里加"Case"的分支条件,修改原有的类?这就等于说,不但对扩展开放了,对修改也开放了。 但缺点就是由于每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。