Один из моих друзей сказал мне, что если я хочу быть хорошим программистом, мне нужно изучить шаблоны проектирования. И я начал на этом сайте:
https://github.com/kamranahmedse/design-patterns-for-humans
Я начал с простой фабрики.
И как вы можете видеть на этой странице, вам нужно реализовать:
И вы можете использовать его так (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»);
Вы могли бы определенно использовать
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;
}
Таким образом, рефакторинг легче осуществить, если требования вашего проекта изменятся.
Design Patterns — действительно хороший совет!
А также factory method
шаблон также хороший совет. Цель фабричного метода — определить интерфейс для создания объекта, но какой объект будет создан, вы можете определить в время выполнения! Следовательно, если вы не знаете, будет ли это деревянная, металлическая или пластиковая дверь — вы должны использовать заводской метод.
Но если вы точно знаете, что это будет деревянный дор — вы можете придерживаться ПОЦЕЛУЙ (Будь проще, глупый) и YAGNI (Тебе это не понадобится).