Guice指南-简单工厂模式

上一篇 / 下一篇  2008-03-21 17:06:13 / 个人分类:Guice

在发现依赖注入之前,最常用的是工厂模式。除了服务接口之外,你还有一个既可以向客户提供服务对象,也可以向测试程序传递伪服务对象的工厂类。在这里我们会将服务实现为一个单件对象,以便让示例尽量简化。

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();
  }
}
客户程序足够简单。但客户程序的单元测试代码必须将一个伪服务对象传入工厂,同时要记得在测试后清理。在我们这个简单的例子里,这不算什么难事儿。但当你增加了越来越多的客户和服务代码后,所有这些伪代码和清理代码会让单元测试的开发一团糟。此外,如果你忘记在测试后清理,其他测试可能会得到与预期不符的结果。更糟的是,测试的成功与失败可能取决于他们被执行的顺序。
public void testClient() {
  Service previous = ServiceFactory.getInstance();
  try {
    final MockService mock = new MockService();
    ServiceFactory.setInstance(mock);
    Client client = new Client();
    client.go();
    assertTrue(mock.isGone());
  }
  finally {
    ServiceFactory.setInstance(previous);
  }
}
 
最后,注意服务工厂的API把我们限制在了单件这一种应用模式上。即便 getInstance() 可以返回多个实例, setInstance() 也会束缚我们的手脚。转换到非单件模式也意味着转换到了一套更复杂的API。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2010-03-22  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 60451
  • 日志数: 171
  • 影音数: 3
  • 建立时间: 2008-02-28
  • 更新时间: 2008-05-19

RSS订阅

Open Toolbar