父类是否应该引用子类?

Rig*_*ggy 3 java inheritance design-patterns

早上好,

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

以下是遗留代码中的几个位置的编码样式示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Log4JLoggerFactory和LogBackLoggerFactory扩展LoggerFactory的位置.

这对我来说真的很陌生,但在我重新考虑代码之前,这个设计模式是否有任何目的或好处(甚至还有正式名称)?

任何想法或建议表示赞赏.谢谢!

编辑:在阅读了Yishai的回复后,我想我会在维基百科的战略模式文章中加入一个链接,以便于参考.感谢大家的回复!

Yis*_*hai 11

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

话虽这么说,依赖注入是所有的愤怒,这样的模式可能确实被用奉献工厂接口专用的工厂类取代,但在没有一个更大的设计的原因,我想你给的例子是一个完全合理的设计选择.


Vla*_*nov 5

这是一个很好的实践,称为工厂方法

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