这是一个有关在静态接口方法内部使用静态工厂方法的设计问题。我正在寻找使用此模式的改进或缺点。
public interface SampleService {
// 1) do work
void doWork();
static SampleService create(final String service) {
// 2) Dispatch to factory method to get correct implementation
return Factory.create(service);
}
class Factory {
private static SampleService create(final String service) {
// 3) return one of many possible implementations
return new DefaultSampleService();
}
}
class DefaultSampleService implements SampleService {
@Override
public void doWork() {
// 4) performs work
}
}
}
在原始实现中,呼叫者会呼叫
SampleService.Factory.create
现在他们称之为
SampleService.create
看起来更干净,更易读。
那么我们对此有何改进?
最佳答案
我建议不要将工厂放入接口,原因如下:
它违反了Open-Closed原则(https://en.wikipedia.org/wiki/Open/closed_principle)。
使用接口SampleService
的客户端不需要接口(文件)经常更改。这始终是错误的根源。
因此,接口中的工厂方法不是一种好的编程风格(我认为)。我建议将Interface和Factory分为两个不同的类。可能的客户不必知道是否创建了新的子类型,这样,程序的易失性部分就封装在Factory类中。