IMZRH的日志

努力成为一个有用的人

导航

31天重构指南之十九:提取工厂类

Posted on 2009-10-15 14:30  张荣华  阅读(691)  评论(0编辑  收藏  举报

今天要说的重构最早由Gof提出,在网络上可以找到很多的资源。两个不同的工厂模式可以在这里找到:Abstract Factroy Factory Method

通常我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来说就是创建对象的实例并调用对象的方法。有时如果要创建的对象很多,则代码会变的复杂。这便是工厂模式发挥作用的情形。关于工厂模式的完整描述可以从这里查看。工厂模式的复杂应用是使用抽象工厂(Abstract Factory)创建对象集,但我们在这里只是使用基本的工厂类创建对象的一个实例。让我们来看下面的代码:

   1: public class PoliceCarController
   2: {
   3:     public PoliceCar New(int mileage, bool serviceRequired)
   4:     {
   5:         PoliceCar policeCar = new PoliceCar();
   6:         policeCar.ServiceRequired = serviceRequired;
   7:         policeCar.Mileage = mileage;
   8:  
   9:         return policeCar;
  10:     }
  11: }
 
在上面的代码中,New方法的目的是创建PolicaCar的实例并根据外部输入设置实例的属性,在一般情形下,New方法可以良好工作,但是随着时间的推移,
PoliceCar的创建工作要做的事件会越来越多,其中有一些事情不应该出现在PoliceCarController中,在这种情形下我们将PoliceCar的创建工作从
PoliceCarController中提到到工厂类中。
   1: public interface IPoliceCarFactory
   2: {
   3:     PoliceCar Create(int mileage, bool serviceRequired);
   4: }
   5:  
   6: public class PoliceCarFactory : IPoliceCarFactory
   7: {
   8:     public PoliceCar Create(int mileage, bool serviceRequired)
   9:     {
  10:         PoliceCar policeCar = new PoliceCar();
  11:         policeCar.ReadForService = serviceRequired;
  12:         policeCar.Mileage = mileage;
  13:         return policeCar;
  14:     }
  15: }
  16:  
  17: public class PoliceCarController
  18: {
  19:     public IPoliceCarFactory PoliceCarFactory { get; set; }
  20:  
  21:     public PoliceCarController(IPoliceCarFactory policeCarFactory)
  22:     {
  23:         PoliceCarFactory = policeCarFactory;
  24:     }
  25:  
  26:     public PoliceCar New(int mileage, bool serviceRequired)
  27:     {
  28:         return PoliceCarFactory.Create(mileage, serviceRequired);
  29:     }
  30: }
 
现在我们将创建逻辑提取到工厂类中,我们可以添加另一个类来创建对象的实例却不用担心引入重复代码。
 
原文链接:http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/19/refactoring-day-19-extract-factory-class.aspx