В любом месте, где вам нужно значение времени выполнения для построения конкретной зависимости, Abstract Factory - это решение.
Мой вопрос: Каковы плюсы и минусы обоих решений?
Вот пример, чтобы понять, что я имею в виду
Если у вас есть служба, для которой требуется репозиторий с определенным контекстом, то конструктор службы требуется фабрика для создания репозитория или доступа к нему.
Обычным решением для этого является создание RepositoryFactoryInterface , подобного этому.
public IRepositoryFactory {
IRepository Create(ContextInformation context);
}
public class MyService {
private IRepositoryFactory repositoryFactory;
public MyService(IRepositoryFactory repositoryFactory)
{
this.repositoryFactory = repositoryFactory:
}
public void DoSomeService()
{
ContextInformation context = ....;
IRepository repository = this.repositoryFactory.Create(context);
repository.Load(...);
...
repository.Save(...);
}
}
Вам также необходимо каким-то образом реализовать интерфейс IRepositoryFactory
public MyEf4RepositoryFactory : IRepositoryFactory
{
IRepository Create(ContextInformation context)
{
return new MyEf4Repository(context);
}
}
... и использовать его в приложении
public void main()
{
IRepositoryFactory repoFactory = new MyEf4RepositoryFactory();
IService service = new MyService(repoFactory);
service.DoSomeService();
}
- ---- Конец основного решения ------
Вместо RepositoryFactoryInterface вы можете сделать то же самое с factorydelegate , который требует меньше кода, как это.
public class MyService {
private Func repositoryFactory;
public MyService(Func repositoryFactory)
{
this.repositoryFactory = repositoryFactory:
}
public void DoSomeService()
{
ContextInformation context = ....;
IRepository repository = this.repositoryFactory(context);
repository.Load(...);
...
repository.Save(...);
}
}
... и используйте это в приложении
public void main()
{
IService service = new MyService(context => new MyEf4Repository(context));
service.DoSomeService();
}
На мой взгляд, factorydelegate context => new MyEf4Repository (context)
намного компактнее, чем
объявление и реализация интерфейса IRepositoryFactory
и MyEf4RepositoryFactory
.
Для этого должна быть причина, и я хочу знать, почему.
Вот один пример источника, который использует интерфейс aproach: ответ на-есть-шаблон-для-инициализации-объектов-созданных-через-ди-контейнер
[Обновление] Спустя 15 месяцев после того, как я задал этот вопрос и получив больше опыта работы с юниверсами Java, я передумал: теперь я предпочитаю интерфейсы делегатам. Но я не могу сказать почему. Это просто ощущение. Может быть, потому что я больше к этому привык?