设计模式之工厂方法模式
场景:大学生和志愿者都学雷锋做好事,不排除将来有别的职业的人(工人,老师等)也加入到学雷锋的行业
简单工厂实现:
1 //一个雷锋公共类,具体方法房子公共类里面 2 class LeiFeng 3 { 4 public void Sweep() 5 { 6 7 } 8 public void Wash() 9 { 10 11 } 12 public void BuyRice() 13 { 14 15 } 16 } 17 //学雷锋的大学生 18 class Undergraduate : LeiFeng { } 19 20 //学雷锋的志愿者 21 class Volunteer : LeiFeng { } 22 23 class Factory 24 { 25 public static LeiFeng CreateFactory(int type) 26 { 27 LeiFeng model = null; 28 //简单工厂弊端,现在是大学生和志愿者做好事,需要其他类型时,需要修改工厂,破坏了开闭原则 29 switch (type) 30 { 31 case 1: 32 model = new Undergraduate(); 33 break; 34 case 2: 35 model = new Volunteer(); 36 break; 37 //再增加别的需要单独修改 38 } 39 return model; 40 } 41 }
1 static void Main(string[] args) 2 { 3 //被帮助的人不需要知道是谁做了好事,只知道是学雷锋就行了 4 //无论是1,还是2,都是做好事的人 5 LeiFeng studentA = Factory.CreateFactory(1); 6 studentA.Sweep(); 7 8 LeiFeng personA = Factory.CreateFactory(2); 9 personA.Wash(); 10 }
缺乏扩展性,如果增加工人也来学雷锋,需要先增加一个工人类,然后再修改工厂。
简单工厂最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相应的类,对客户端来说,去除了与具体产品的依赖。
工厂方法模式:
1 //一个雷锋公共类,具体方法房子公共类里面 2 class LeiFeng 3 { 4 public void Sweep() 5 { 6 7 } 8 public void Wash() 9 { 10 11 } 12 public void BuyRice() 13 { 14 15 } 16 } 17 //学雷锋的大学生 18 class Undergraduate : LeiFeng { } 19 20 //学雷锋的志愿者 21 class Volunteer : LeiFeng { } 22 23 //新增一个职业时: 学雷锋的工人 24 class Worker:LeiFeng{ } 25 //雷锋工厂 26 interface IFactory 27 { 28 LeiFeng CreateLeiFeng(); 29 } 30 //学雷锋的大学生 的工厂 31 class UndergraduateFactory : IFactory 32 { 33 public LeiFeng CreateLeifeng() 34 { 35 return new Undergraduate(); //实现接口,对应指定的大学生类 36 } 37 } 38 //社区志愿者 的工厂 39 class VolunteerFactory : IFactory 40 { 41 public LeiFeng CreateLeifeng() 42 { 43 return new Volunteer(); //实现接口,对应指定的志愿者类 44 } 45 } 46 //新增一个职业时:新增一个工厂 47 class WorkerFactory : IFactory 48 { 49 public LeiFeng CreateLeifeng() 50 { 51 return new Worker(); 52 } 53 }
1 static void Main(string[] args) 2 { 3 //在客户端选择要使用的子类工厂,从而避免了增加CASE语句的问题 4 //大学生来帮助 5 IFactory factory = new UndergraduateFactory(); 6 //被帮助的人只知道是被雷锋帮助了,并不需要具体知道是大学生,还是工人,还是志愿者 7 LeiFeng person = factory.CreateLeiFeng(); 8 person.Sweep(); 9 10 //志愿者来帮助 11 IFactory factoryVolunteer = new VolunteerFactory(); 12 LeiFeng person2 = factoryVolunteer.CreateLeiFeng(); 13 person2.Wash(); 14 }
总结:工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,如果想要增加功能,那么需要增加工厂并且修改客户端。一定程度上缓解了耦合度。工厂模式是简单工厂的进一步抽象和推广。
缺点:每增加一个产品,就需要对应增加一个产品工厂的类。
浙公网安备 33010602011771号