Заводской шаблон для возврата списка

В своей программе я загружаю один файл на несколько серверов, например, гугл диск, дропбокс и так далее одновременно. Я использую шаблон проектирования адаптера для адаптации API каждого сервера, поэтому каждый конкретный класс сервера реализует интерфейс FileServer, и в конце у меня есть список объектов FileServer. Мой вопрос: поскольку моя программа должна будет поддерживать новые серверы в будущем, как лучше всего инкапсулировать все экземпляры этих серверных объектов (я имею в виду часть "...= new...")?< /strong> На ум приходит фабричный шаблон, но правильно ли возвращать список в фабричном методе? Спасибо.


person Community    schedule 22.11.2013    source источник


Ответы (1)


Обычно фабричный шаблон инкапсулирует сложность создания одного объекта из какого-то «материала», такого как спецификация. Например, имея URL-адрес, создайте соединение с сервером, определенным URL-адресом.

В вашем случае канонический шаблон Factory будет использовать некоторую спецификацию для хранилища файлов (URL-адрес, объект контекста и т. д.) и создать один объект файлового сервера. Хотя ничто не запрещает вам возвращать список объектов из фабричного метода с учетом списка спецификаций, почти так же просто и, возможно, чище перебирать список спецификаций и вызывать фабричный метод для каждой из них. Что-то вроде этого:

List<FileServer> fsList = new ArrayList<FileServer>();
for(FSSpec spec : fileServerSpecs)
{
    FileServer fs = FileServerFactory.create(spec);
    fsList.add(fs);
}

// do something with your list of file servers.

Это также более удобно для повторного использования, потому что вероятны ситуации, когда вы хотите создать один файловый сервер из спецификации, не беспокоясь о создании списка из одного элемента только с этой спецификацией для передачи в ваш фабричный метод.

person lreeder    schedule 22.11.2013
comment
Спасибо @Ireeder за ответ. Но я не вижу никаких спецификаций для своих серверов, потому что я не знаю деталей сервера в коде, просто знаю, что он будет реализовывать интерфейс FileServer. Я могу знать имя/класс сервера, а затем отправить его как спецификацию, но где я могу получить имена/классы всех поддерживаемых серверов, текстовый файл/перечисление singleton, возможно? Еще раз спасибо. - person ; 22.11.2013
comment
Вы можете предоставить фабрике список различных реализаций FileServer, либо жестко запрограммировав его, если вы думаете, что он будет редко меняться, либо внедрить их с помощью статического метода настройки, если вам нужен больший контроль над тем, что находится в списке. - person lreeder; 23.11.2013
comment
Хорошо, понял. Спасибо. - person ; 23.11.2013