设计模式之工厂方法模式

场景:大学生和志愿者都学雷锋做好事,不排除将来有别的职业的人(工人,老师等)也加入到学雷锋的行业

简单工厂实现:

 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         }
客户端

总结:工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,如果想要增加功能,那么需要增加工厂并且修改客户端。一定程度上缓解了耦合度。工厂模式是简单工厂的进一步抽象和推广。

缺点:每增加一个产品,就需要对应增加一个产品工厂的类。

posted on 2013-08-05 17:53  冲刺  阅读(139)  评论(0)    收藏  举报

导航