Должен ли я сделать прямой вызов
хранилище изнутри
завод
Нет, не используйте фабрику при получении данных, используйте фабрику только при первом ее создании.
Как мне управлять созданием объекта
при извлечении данных из базы данных?
Передать эти данные на фабрику, если они необходимы для первоначального создания объекта.
Что мне нужно, чтобы сделать этот класс
завершите, какие другие методы я должен
есть
Многие фабрики - это даже не отдельные классы, это просто методы, которые обеспечивают создание объектов. Вы можете сложить фабричный метод в другой класс, если вам кажется, что он просто собирается вызвать конструктор без параметров.
Должен ли я использовать этот класс для создания
Объект Product из домена и
хранилище справа?
Хранилище предназначено для получения (в некотором смысле создания) существующих объектов, фабрика впервые создает объект.
Изначально многие фабрики мало что делают, кроме вызова конструктора. Но как только вы начинаете рефакторинг и / или создаете более крупные иерархии объектов, фабрики становятся более актуальными.
Объяснение и пример:
Например, в проекте, над которым я работаю, у меня есть базовый класс процессора Excel и много подклассов, реализующих этот базовый класс. Я использую фабрику, чтобы получить правильный, и затем вызываю методы, не зная, какой подкласс был возвращен. (Примечание: я изменил некоторые имена переменных и потрошил / изменил много кода)
Базовый класс процессора:
public abstract class ExcelProcessor
{
public abstract Result Process(string ExcelFile);
}
Один из подклассов процессора:
public class CompanyAExcelProcessor : ExcelProcessor
{
public override Result Process(string ExcelFile)
{
//cool stuff
}
}
Factory:
public static ExcelProcessor CreateExcelProcessor(int CompanyId, int CurrentUserId)
{
CompanyEnum company = GetCompanyEnum(CompanyId);
switch (company)
{
case CompanyEnum.CompanyA:
return new CompanyAExcelProcessor();
case CompanyEnum.CompanyB:
return new CompanyBExcelProcessor();
case CompanyEnum.CompanyC:
return new CompanyCExcelProcessor(CurrentUserId);
//etc...
}
}
Использование:
ExcelProcessor processor = CreateExcelProcessor(12, 34);
processor.Process();