当前位置: 首页 > 面试题库 >

父母班应该引用孩子班吗?

郭璞
2023-03-14
问题内容

早上好,

我在工作中继承了一些旧代码,并且使用的是一种非常不寻常的设计模式。我在论坛上唯一可以找到的类似模式的参考资料是在这里。情况是原始设计者有一个泛型父类(不是抽象类),该类具有静态工厂方法,该方法直接引用子类。

这是这种编码样式的示例,可在旧版代码的多个地方找到:

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上有关Strategy模式的文章的链接,以方便参考。感谢大家的回应!


问题答案:

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

话虽这么说,但是依赖注入已成为一种流行,这种模式的确可以由带有专用Factory接口的专用Factory类代替,但是在没有更大设计原因的情况下,我认为您给出的示例是完全合理的设计选择。



 类似资料:
  • 问题内容: 我正在努力实现的目标 我有两个类- 和-我想影响状态上的类(例如)。 我的尝试 我想显示上。 预期产量 : 电流输出: 环境 我在React.js中使用Material-UI。在这种情况下,我正在使用导出。 问题答案: 下面是正确的语法: 相关答案和文档: jss-plugins嵌套文档

  • 问题内容: 我试图以这样一种方式编写SQL Server 2008查询,以便可以根据需要循环遍历输出和输出标头。我已经多次以错误的方式完成了这些工作,并让ColdFusion在页面中进行了艰苦的工作,但是需要在SQL Server中完成。 我希望查询结果集如下所示: 如果ParentID为0,则表示它是主要类别。如果ParentID大于0,则表示它是次要类别,是父级的子级。 因此,父母需要订购A-

  • 我一直在将代码从JIT转换到D3,并使用树布局。我已从中复制了代码http://mbostock.github.com/d3/talk/20111018/tree.html使用我的树数据,但我想做更多。 在我的例子中,我想创建子节点,这些子节点合并回一个较低级别的父节点,我意识到这更像是一个有向图结构,但是希望树能够适应这一点(即注意子节点之间的公共id应该合并)。 因此,基本上,一棵树在从父母到

  • 问题内容: 我在这里有一个简单的设置: 我有一个父组件,该父组件有2个子组件。在第一个子组件中:用户更改输入的值。然后,该更改的值将是我想要从该孩子传递给父对象的道具,以便可以将其传递给与同一父组件相连的另一个孩子。 当前设置的这个,请查看 从用户输入到UI更改的流程:1.在“ Child 1”中:调整一个滑块,将onChange值传递给父组件;2.将此属性(新的滑块值)传递给Parent组件,以

  • 问题内容: 我的班级应同时扩展两个班级: 怎么做? 更新 。由于这是不可能的,那么我该如何将那个AbstractBillingActivity和Preferences一起使用? Upd2 。如果我使用接口,我应该创建: 计费接口 } 偏好活动 } 抽象帐单活动 } 然后 问题答案: Java不支持多重继承。 我可以想到一些解决方法: 第一个是聚合:创建一个将这两个活动作为字段的类。 第二是使用接口

  • 问题内容: 最初,我一直在尝试获取父母的名单以及每个父母的一个最近的孩子。我已经知道如何使用以下查询 但是问题是,结果不包括没有孩子的父母。添加也无济于事。所以我想我可以对所有没有孩子的父母进行查询,然后将这两个查询合并为一个查询。但是我在建立这样的查询时遇到了麻烦。将不胜感激任何建议。 问题答案: 这是您的查询: