2010-11-29 55 views
3

早上好,父类是否应引用子类?

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

回答

11

这是Java中非常标准的模式,也是实现策略模式的常用方式。您始终可以在标准API中看到它(Calendar与GregorianCalendar,NumberFormat与DecimalFormat等)。这就是说,随着依赖注入的风靡,这种模式可能确实被具有专用工厂接口的专用工厂类取代,但是由于没有更大的设计原因,我认为你给出的例子是一个完全合理的设计选择。

0

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

4

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

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

0

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

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

相关问题