【问题标题】:Factory Method Implementation工厂方法实现
【发布时间】:2010-04-17 19:25:59
【问题描述】:

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

这是我的尝试。以下代码是否实现了链接中指定示例的工厂模式?请验证并建议这是否必须进行任何重构。

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;
    }
}

【问题讨论】:

    标签: java design-patterns factory-pattern factory-method


    【解决方案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;
    }
    

    }

    您可能希望包含一个“默认”案例。

    【讨论】:

    • 这不是 Factory Method 模式;这正是此 OP 引用的 question 的原始作者使用的模式。该问题的答案表明它是Simple Factory 而不是GoF“工厂方法”。 (我发现了这个和那个问题,因为我也在努力更好地理解 real 工厂方法)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多