2013-03-12 161 views
2

我有兩個類用一個方法編碼到單個接口IStore StoreData(data) - 一個類將數據發送到寫入到數據庫的Web服務,另一個類將數據直接寫入到D B。 (工廠模式)工廠模式:將參數傳遞給具體類

public IStore GetStorageClass(StorageType type) 
{ 
    if (type == StorageType.WebService) 
     return new WebService(); 
    else 
     return new DatabaseStore(); 
} 

現在,DatabaseStore類需要一個連接字符串才能工作。 問題是,誰的責任是提供連接字符串到DatabaseStore以及如何?我認爲:

  1. 工廠才知道連接字符串傳遞給DatabaseStore

  2. 的DatabaseStore構造從終端用戶提供了配置讀取它。

  3. GetStorageClass的來電顯示,雖然不知道確切的落實,通過參數和值,其中的參數是連接字符串詞典(調用者知道使用數據庫需要連接字符串)

哪個選項我應該選擇並在這裏正確使用工廠模式嗎? 感謝幫助!

回答

1

責任是包含GetStorageClass的類。要麼它是用提供給它的構造函數的連接字符串值構造的,要麼它具有從另一個源讀取值的私有方法。

除了存儲類型之外,傳入鍵值存儲將會過於模糊,API的使用者只想獲取IStore的實例,而不是配置它。

如果您需要爲特定的IStore實現進行配置,您可能需要爲該實現實施Builder模式,並將構建器注入工廠。

+0

謝謝凱文。因此,在這種情況下,FactoryProvider類(包含GetCtorageClass)將成爲'director'並實例化一個特定於數據庫的構建器來創建DatabaseStore?儘管如此,構建器的配置(連接字符串)最終需要由FactoryProvider給出,對吧? – 2013-03-13 01:15:56

+1

這樣考慮:這是FactoryProvider FactoryProvider(DatabaseStoreBuilder dsb)的一個構造函數{this.dataStoreBuilder = dsb; }現在,在GetStorageClass中,DatabaseStore的情況是this.dataStoreBuilder.InitializeDataStore();您傳入的DatabaseStoreBuilder類是使用連接字符串構建的。 FactoryProvider不需要自己構建構建器。 – Kevin 2013-03-13 04:11:09