Интерфейсы и классы против простого шаблона проектирования фабрики

Один из моих друзей сказал мне, что если я хочу быть хорошим программистом, мне нужно изучить шаблоны проектирования. И я начал на этом сайте:
https://github.com/kamranahmedse/design-patterns-for-humans

Я начал с простой фабрики.
И как вы можете видеть на этой странице, вам нужно реализовать:

  • Дверь интерфейса
  • класс WoodenDoor
  • Класс DoorFactory

И вы можете использовать его так (PHP):

$door = DoorFactory::makeDoor(100, 200);
echo 'Width: ' . $door->getWidth();
echo 'Height: ' . $door->getHeight();

Но мне было интересно, зачем мне нужен слой класса DoorFactory, который дает мне новый экземпляр WoodenDoor с заданным параметром, когда я могу просто сделать:

Door door = new WoodenDoor(100, 200);

Каково же большое значение при создании этой фабрики, когда я могу просто создать экземпляр, передав заданный параметр конструктора с помощью нового оператора ClassName?


РЕДАКТИРОВАНИЕ

Аргумент, который говорит, что я могу легко управлять изменениями во многих случаях отмены данного элемента этим решением:

Создание заданного класса (как заданного типа фабрики в фабричном решении), например:

класс LongWoodenDoor, который расширяет класс WoodenDoor и использует конструктор WoodenDoor с заданными параметрами. например, с помощью super («100», «200»);

1

Решение

Вы могли бы определенно использовать

Door door = new WoodenDoor(100, 200);

создать двери, но я бы процитировал из учебника, что вы читаете:

Простая фабрика просто генерирует экземпляр для клиента без раскрытия какой-либо логики реализации клиенту

Целью фабрики является то, что клиенту не нужно ничего знать о конструкторе класса дверей, чтобы создать дверь.

Ваша фабрика может не принимать никаких параметров при создании двери:

Функция makeDoor:

Door* DoorFactory::makeDoor()
{
Door *newDoor = new Door(200, 100);
return newDoor;
}

Где твоя дверь?

Door door = DoorFactory::makeDoor();

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

Также, если вы хотите изменить конструктор класса Door в будущем, добавьте еще один параметр с именем толщина:

Door::Door(double width, double height, double thickness)

Вам не нужно менять каждый экземпляр двери в проекте, вы можете просто изменить заводской код в одном месте:

Door* DoorFactory::makeDoor(double width, double height)
{
Door *newDoor = new Door(width, height, 5);
return newDoor;
}

Таким образом, рефакторинг легче осуществить, если требования вашего проекта изменятся.

0

Другие решения

Design Patterns — действительно хороший совет!

А также factory method шаблон также хороший совет. Цель фабричного метода — определить интерфейс для создания объекта, но какой объект будет создан, вы можете определить в время выполнения! Следовательно, если вы не знаете, будет ли это деревянная, металлическая или пластиковая дверь — вы должны использовать заводской метод.

Но если вы точно знаете, что это будет деревянный дор — вы можете придерживаться ПОЦЕЛУЙ (Будь проще, глупый) и YAGNI (Тебе это не понадобится).

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector