【问题标题】:Should a parent class ever reference child classes?父类是否应该引用子类?
【发布时间】:2010-11-29 14:23:14
【问题描述】:

早上好,

我在工作中继承了一些遗留代码,它使用了一种相当不寻常的设计模式。我在论坛上能找到的唯一一个类似模式的参考是here。情况是原始设计者有一个通用的父类(不是抽象的),它有一个直接引用子类的静态工厂方法。

下面是这种编码风格的示例,在遗留代码的几个地方都可以找到:

public static LoggerFactory getLoggerFactory(LogType type) {
    switch (type) {
    case LOG4J:
        return Log4JLoggerFactory.getInstance();
    case LOGBACK:
        return LogBackLoggerFactory.getInstance();
    default:
        throw new RuntimeException("No logger factory defined for type " + type);
    }
}

Log4JLoggerFactory 和 LogBackLoggerFactory 扩展 LoggerFactory。

这对我来说似乎很陌生,但在我对代码进行重大重构之前,这种设计模式有什么目的或好处(甚至有正式的名称吗)?

感谢任何想法或建议。谢谢!

编辑:在阅读了 Yishai 的回复后,我想我会附上一个指向 Wikipedia article on the Strategy pattern 的链接,以方便参考。感谢大家的回复!

【问题讨论】:

    标签: java design-patterns inheritance


    【解决方案1】:

    这是 Java 中非常标准的模式,也是实现策略模式的常用方法。您一直在标准 API 中看到它(Calendar 与 GregorianCalendar、NumberFormat 与 DecimalFormat 等等)。

    话虽如此,随着依赖注入风靡一时,这种模式确实可能被具有专用工厂接口的专用工厂类所取代,但在没有更大的设计原因的情况下,我认为您给出的示例是一个完全合理的设计选择。

    【讨论】:

      【解决方案2】:

      这是一个很好的做法,称为Factory Method

      好处是你返回了一些具体的实现,但通过通用接口或基类隐藏它。因此客户端不会被实现细节所困扰,而是使用最基本的类。

      【讨论】:

        【解决方案3】:

        也许他们已经设置为在一个环境中使用 Log4J,而在另一个环境中使用 Logback?我知道有时开发人员在进行本地开发时更喜欢使用工具,但是在部署时必须使用公司认可/批准的任何工具。

        【讨论】:

          【解决方案4】:

          这是一个好还是坏的做法取决于情况。例如,当“父母”知道如何创建所有孩子时,这可能是一个好习惯。当父母不知道时,这种解决方案只会造成麻烦。

          另一个问题是可测试性:如果父级有很多子级,则可能很难创建与子级隔离的父级,但这又取决于。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-09-20
            • 2012-05-28
            • 1970-01-01
            • 2019-01-08
            • 1970-01-01
            • 2016-03-26
            • 2020-03-03
            相关资源
            最近更新 更多