Как стать автором
Обновить

Комментарии 7

Даже базовые конструкции if else являются фабричным методом, так как и switch.

Вы не могли бы развернуть это утверждение?

if (nameMob == "ogre")
{
    return new MobModel(descriptions.ListOgre[level]);
}

if (nameMob == "troll")
{
    return new MobModel(descriptions.ListTroll[level]);
}

тоже самое на swich


switch (nameMob)
        {
            case "ogre":
                return new MobModel(descriptions.ListOgre[level]);

            case "troll":
                return new MobModel(descriptions.ListTroll[level]);
        }

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

Ну давайте, что ли, на примерах.


Является ли вот такой код фабричным методом?


public bool IsBig()
{
  if (Length > 5)
    return true;
  else
    return false;
}

А вот такой?


public void ReadABook()
{
  Book book;
  if (Hour > 17)
    book = new EveningBook();
  else
    book = new DayBook();
  book.Read()
}
Фабрика, в любых ее проявлениях, позволяет отложить указание типа создаваемого объекта до времени исполнения. Наличие или отсутствие логического ветвления в методе ни о чем не говорит.
указание типа

Наверное, все же, указание реализации.
Ну и про время исполнения тоже сложно — наверняка на шаблонах тоже можно запилить фабрику.

Я несколько раз начинал и стирал свой ответ пока не понял почему слово "реализация" в этом контексте мне не нравится.


В большинстве (наверное во всех, но я всех не знаю) ООП языках конструкторы не поддерживают полиморфизм. Соответсвенно фабрики используются для обхода этого ограничения. Полиморфный метод статически связывается с конкретным конструктором. Конструктор это атрибут типов, а не реализаций.


Есть и другие способы выбора реализации (даже если относится к термину очень вольно), например использовать делегаты вместо методов или даже просто через ветвление.


Поэтому мне кажется что слово "тип" тут больше подходит.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории