2010-04-17 96 views
3

我正在浏览SO中的“工厂方法”页面,并且遇到了这个link。 和this comment。这个例子看起来像一个变种,并认为以其原始方式实现:将实例化推迟到子类...工厂方法实施

这是我的尝试。以下代码是否实现链接中指定示例的Factory模式?请验证并建议是否必须进行重新分解。

public class ScheduleTypeFactoryImpl implements ScheduleTypeFactory { 

    @Override 
    public IScheduleItem createLinearScheduleItem() { 
      return new LinearScheduleItem(); 
    } 

    @Override 
    public IScheduleItem createVODScheduleItem() { 
    return new VODScheduleItem(); 
    } 

} 

public class UseScheduleTypeFactory { 

    public enum ScheduleTypeEnum { 
     CableOnDemandScheduleTypeID, 
      BroadbandScheduleTypeID, 
      LinearCableScheduleTypeID, 
      MobileLinearScheduleTypeID 
    } 

    public static IScheduleItem getScheduleItem(ScheduleTypeEnum scheduleType) { 
     IScheduleItem scheduleItem = null; 
     ScheduleTypeFactory scheduleTypeFactory = new ScheduleTypeFactoryImpl(); 
     switch (scheduleType) { 
     case CableOnDemandScheduleTypeID: 
      scheduleItem = scheduleTypeFactory.createVODScheduleItem(); 
      break; 

     case BroadbandScheduleTypeID: 
      scheduleItem = scheduleTypeFactory.createVODScheduleItem(); 
      break; 

     case LinearCableScheduleTypeID: 
      scheduleItem = scheduleTypeFactory.createLinearScheduleItem(); 
      break; 

     case MobileLinearScheduleTypeID: 
      scheduleItem = scheduleTypeFactory.createLinearScheduleItem(); 
      break; 
     default: 
      break; 
     } 
     return scheduleItem; 
    } 
} 

回答

1

我想说,没关系,虽然在我看来过于复杂。你并不需要ScheduleTypeFactoryImpl课程。然后,您可以将UseScheduleTypeFactory类更改为ScheduleTypeFactory

我在想什么是这样的:

公共类ScheduleTypeFactory {

public enum ScheduleTypeEnum { 
    CableOnDemandScheduleTypeID, 
     BroadbandScheduleTypeID, 
     LinearCableScheduleTypeID, 
     MobileLinearScheduleTypeID 
} 

public static IScheduleItem getScheduleItem(ScheduleTypeEnum scheduleType) { 
    IScheduleItem scheduleItem = null; 
    switch (scheduleType) { 
    case CableOnDemandScheduleTypeID: 
     scheduleItem = new VODScheduleItem(); 
     break; 

    case BroadbandScheduleTypeID: 
     scheduleItem = new VODScheduleItem(); 
     break; 

    case LinearCableScheduleTypeID: 
     scheduleItem = new LinearScheduleItem(); 
     break; 
    case MobileLinearScheduleTypeID: 
     scheduleItem = new LinearScheduleItem(); 
     break; 
    default: 
     break; 
    } 
    return scheduleItem; 
} 

}

,你可能想包括一个 '默认' 的情况。

+0

这是**不是**工厂方法模式;这正是OP引用的[question]原始作者(http://stackoverflow.com/questions/806911/is-this-factory-method-creation-pattern)使用的模式。这个问题的答案表明这是一个“简单工厂”,而不是GoF的“工厂方法”。 (我发现这个和这个问题,因为我也想更好地理解*真实*工厂方法) – 2011-08-26 18:08:04