Guice指南-簡單工廠模式

梧桐雨—168發表於2008-03-21
在發現依賴注入之前,最常用的是工廠模式。除了服務介面之外,你還有一個既可以向客戶提供服務物件,也可以向測試程式傳遞偽服務物件的工廠類。在這裡我們會將服務實現為一個單件物件,以便讓示例儘量簡化。

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。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-214951/,如需轉載,請註明出處,否則將追究法律責任。

相關文章