Дизайн класса в соответствии с IOC и абстрактным заводским шаблоном
-
27-09-2019 - |
Вопрос
Какой правильный способ обеспечения ценностей в абстрактный фабричный метод?
Например.
interface IFactory
{
ISomething Create(int runTimeValue);
}
class Factory : IFactory
{
public ISomething Create(int runTimeValue)
{
return new Something(repository, runTimeValue);
}
}
В примере репозиторий вводится через конструктор, когда завод создан, но я могу вместо этого мог переместить репозиторий в интерфейс ifactory
interface IFactory
{
ISomething Create(IRepository repository, int runTimeValue);
}
class Factory : IFactory
{
public ISomething Create(IRepository repository, int runTimeValue)
{
return new Something(repository, runTimeValue);
}
}
Что считается «правильным» способом этого? Как по одной причинами при разработке абстрактной фабрики?
Решение
Абстрактный фабричный рисунок Следует использоваться в случаях, когда объекты, возвращаемые заводом, должны быть «инициализированы» по-разному таким образом, что только завод знает, как это сделать. Таким образом, разные реализации исчезтования будут «инициализированы» или созданы по-разному, и только их соответствующие фабричные реализации знают, как это сделать.
В вашем случае вы должны спросить себя:
Делать все Реализации ISOMETHINGS Нужна ирпозитория, а также рутимевале? В этом случае вы можете просто использовать фабричный шаблон.
Используйте абстрактную фабрику в таком сценарии: (что-то и всеграмоты, созданные по-разному)
interface IFactory {
ISomething Create(int runTimeValue);
}
class Factory : IFactory {
public ISomething Create(int runTimeValue) {
return new Something(repository, runTimeValue);
}
}
class OFactory : IFactory {
public ISomething Create(int runTimeValue) {
// constructor takes different parameters
SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue);
thing.SetCustomRepository(new OtherRepositoryImpl());
return thing;
}
}
Другие советы
Я бы сказал быть последовательным. Если ваш репозиторий вводится везде, что он используется, он имеет смысл ввести его в конструктор фабрики, а не сделать его частью интерфейса.