这是一个有关在静态接口方法内部使用静态工厂方法的设计问题。我正在寻找使用此模式的改进或缺点。

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类中。

07-24 18:56