2013-03-12 1 views
2

У меня есть два класса, закодированных для одного интерфейса. Один и тот же метод StoreData (данные) - один класс отправляет данные в веб-службу, которая записывает в БД, а другая записывает данные непосредственно в DB. (заводская модель)Factory pattern: Передача аргументов конкретному классу

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

Теперь для класса DatabaseStore требуется строка подключения. Вопрос в том, чья ответственность заключается в том, чтобы предоставить строку подключения в DatabaseStore и как? Я подумал:

  1. Завод просто знает строку подключения для передачи DatabaseStore

  2. Конструктор DatabaseStore считывает его из конфигурации, который предоставил конечному пользователю.

  3. Вызывающего GetStorageClass, хотя и не знает о точном выполнении, передает Словарь параметров и значений, где параметр является строкой соединения (абонент знает, работающий с базами данных требуется подключение строк)

Какого варианта должен ли я выбрать, и я правильно использую шаблон Factory здесь? Цените помощь!

ответ

1

Ответственность за класс, содержащий GetStorageClass. Либо он был построен со значением строки подключения, предоставленным его конструктору, либо имеет частный метод, который считывает значение из другого источника.

Передача в хранилище ключей в дополнение к StorageType будет слишком неоднозначной, потребитель API хочет получить экземпляр IStore, а не настроить его.

Если вам нужно выполнить настройку для конкретных реализаций IStore, вам может понадобиться реализовать шаблон Builder для этой реализации и вставить застройщик на заводе.

+0

Спасибо, Кевин. Итак, в этом случае класс FactoryProvider (содержащий GetCtorageClass) будет «директором» и создаст экземпляр создателя базы данных для создания DatabaseStore? Тем не менее, конфигурация (строка подключения) для строителя в конечном счете должна быть предоставлена ​​FactoryProvider, правильно? –

+1

Рассмотрите это следующим образом: Вот конструктор для FactoryProvider FactoryProvider (DatabaseStoreBuilder dsb) {this.dataStoreBuilder = dsb; } Теперь, в GetStorageClass, ваш случай для DatabaseStore - this.dataStoreBuilder.InitializeDataStore(); Класс DatabaseStoreBuilder, который вы передали, был построен с использованием строки подключения. FactoryProvider не нужно строить сам строитель. – Kevin