2010-04-17 94 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