void go(); }对于这个服务接口,我们有一个缺省的实现,但客户对象不应该直接依赖于这个缺省 实现。如果我们将来打算使用一个不同的服务实现,我们不希望回过头来修改所有的客户 代码。public class ServiceImpl implements Service {
public void go() {
...
}
}我们还有一个可用于单元测试的伪服务对象。public class MockService implements Service {
private boolean gone = false; public void go() { gone = true; } public boolean isGone() { return gone; } }简单工厂模式在发现依赖注入之前,最常用的是工厂模式。除了服务接口之外,你还有一个既可以 向客户提供服务对象,也可以向测试程序传递伪服务对象的工厂类。在这里我们会将服务 实现为一个单件对象,以便让示例尽量简化。public class ServiceFactory { private ServiceFactory() {}
private static Service instance = new ServiceImpl(); public static Service getInstance() { return instance; }
public static void setInstance(Service service) { instance = service; } }客户程序每次需要服务对象时就直接从工厂获取。public class Client { public void go() { Service service = ServiceFactory.getInstance(); service.go(); } }