父类是否应该引用子类?

时间:2010-11-29 14:23:15

标签: java design-patterns inheritance

早上好,

我在工作中继承了一些遗留代码,它使用了一种相当不寻常的设计模式。我在论坛上找到的类似模式的唯一参考是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的链接,以便于参考。感谢大家的回复!

4 个答案:

答案 0 :(得分:11)

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

话虽如此,随着依赖注入风靡一时,这样的模式可能会被专用的Factory类替换为具有专用的Factory接口,但是在没有更大设计理由的情况下,我认为你给出的例子是一个完美合理的设计选择。

答案 1 :(得分:4)

这是一种很好的做法,名为Factory Method

好处是您返回一些具体的实现,但通过公共接口或基类隐藏它。因此,客户端不会受到实现细节的困扰,但可以使用最基本的类。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

另一个问题是可测试性:如果父母有很多孩子,可能很难独立于孩子创建父母,但这又取决于。