在过去的几个月中,我偶然发现了以下技术/模式。但是,我似乎找不到一个特定的名称,也不能百分百确定其所有优点和缺点。
模式如下:
在Java接口中,照常定义了一组常用方法。但是,使用内部类,默认实例会通过接口泄漏。
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
对我来说,最大的优势似乎在于,开发人员只需要了解接口,而无需了解其实现,例如,在他快速想要创建实例的情况下。
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
此外,我已经看到该技术与Spring一起使用,以便根据配置动态提供实例。在这方面,它看起来也可以帮助模块化。
但是,我无法撼动这是滥用接口的感觉,因为它将接口与其实现之一结合在一起。(相关性反转原理等。)有人可以向我解释该技术的调用方式以及它的优缺点吗?
更新:
经过一段时间的考虑后,我重新检查并注意到,使用以下单例版本的模式的频率更高。在此版本中,公共静态实例通过接口公开,该接口仅初始化一次(由于字段为final)。另外,几乎总是使用Spring或将接口与实现分离的通用工厂来检索实例。
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
简而言之:这似乎是一个自定义的单例/工厂模式,它基本上允许通过其接口公开实例或单例。关于缺点,下面的答案和评论中提到了一些缺点。到目前为止,优势似乎在于其便利性。
Vehicle.Default
应该作为工厂类(例如)上移到包名称空间中VehicleFactory
。
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()