Java 父类是否应该引用子类?

Java 父类是否应该引用子类?,java,design-patterns,inheritance,Java,Design Patterns,Inheritance,早上好 我在工作中继承了一些遗留代码,它使用的是一种非常不寻常的设计模式。我在论坛上能找到的关于类似模式的唯一参考是。情况是,原始设计器有一个泛型父类(不是抽象类),它有一个直接引用子类的静态工厂方法 下面是这种编码风格的示例,可以在遗留代码的几个地方找到: public static LoggerFactory getLoggerFactory(LogType type) { switch (type) { case LOG4J: return Log4JLog

早上好

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

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

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

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

任何想法或建议都将不胜感激。谢谢


编辑:在阅读了易海的回复后,我想我会添加一个链接到,以便于参考。谢谢大家的回复

这是Java中非常标准的模式,也是实现策略模式的常用方法。您一直在标准API中看到它(日历与GregorianCalendar、数字格式与十进制格式等等)


这就是说,随着依赖注入风靡一时,这种模式可能确实会被一个带有专用工厂接口的专用工厂类所取代,但在没有更大的设计理由的情况下,我认为您给出的示例是一个非常合理的设计选择。

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

这是一个很好的练习,叫做


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

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

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