当前位置:  开发笔记 > 编程语言 > 正文

工厂阶级知道得太多了

如何解决《工厂阶级知道得太多了》经验,为你挑选了1个好方法。

更新我已经更新了示例以更好地说明我的问题.我意识到它缺少一个特定点 - 即该CreateLabel()方法总是采用标签类型,因此工厂可以决定要创建的标签类型.事实是,它可能需要获得更多或更少的信息,具体取决于它想要返回的标签类型.

我有一个工厂类,它返回表示要发送到打印机的标签的对象.

工厂类看起来像这样:

public class LargeLabel : ILabel
{
    public string TrackingReference { get; private set; }

    public LargeLabel(string trackingReference)
    {
        TrackingReference = trackingReference;
    }
}

public class SmallLabel : ILabel
{
    public string TrackingReference { get; private set; }

    public SmallLabel(string trackingReference)
    {
        TrackingReference = trackingReference;
    }
}

public class LabelFactory
{
    public ILabel CreateLabel(LabelType labelType, string trackingReference)
    {
        switch (labelType)
        {
            case LabelType.Small:
                return new SmallLabel(trackingReference);
            case LabelType.Large:
                return new LargeLabel(trackingReference);
        }
    }
}

假设我创建了一个名为CustomLabel的新标签类型.我想从工厂返回这个,但它需要一些额外的数据:

public class CustomLabel : ILabel
{
    public string TrackingReference { get; private set; }
    public string CustomText { get; private set; }

    public CustomLabel(string trackingReference, string customText)
    {
        TrackingReference = trackingReference;
        CustomText = customText;
    }
}

这意味着我的工厂方法必须改变:

public class LabelFactory
{
    public ILabel CreateLabel(LabelType labelType, string trackingReference, string customText)
    {
        switch (labelType)
        {
            case LabelType.Small:
                return new SmallLabel(trackingReference);
            case LabelType.Large:
                return new LargeLabel(trackingReference);
            case LabelType.Custom:
                return new CustomLabel(trackingReference, customText);
        }
    }
}

我不喜欢这个,因为工厂现在需要满足最低的公分母,但同时CustomLabel类需要获得自定义文本值.我可以提供额外的工厂方法作为覆盖,但我想强制执行CustomLabel需要值的事实,否则它只会被赋予空字符串.

实现此方案的正确方法是什么?



1> Jon Skeet..:

那么,您想如何调用工厂方法?

专注于您希望如何使用您的API,实施通常会使自己相当清楚.如果将所需的API结果写为单元测试,则可以更轻松地完成此操作.

过载可能是正确的做法,但这实际上取决于你想如何使用工厂.


问题是我希望工厂根据参数决定返回哪个标签.问题在于,根据要返回的标签,可能需要其他信息.因为调用代码不能对工厂进行二次猜测,所以它不会知道它需要传递这些额外的信息,所以我们处于僵局,工厂无法获得所需的信息,但被叫做了没有我知道它需要供应它.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有