Я читаю о шаблоне фабричного метода и простой фабрике. Как я понимаю, простой фабрики достаточно, и я не вижу варианта использования паттерна фабричного метода. Прочтите эту ссылку, https://www.binpress.com/factory-design-pattern/, и я буду задавать свои вопросы.
1) в простой фабрике говорит, что это плохо, потому что нарушает принцип открыт / закрыт. Я понимаю это, но в шаблоне фабричного метода то, что он делал, по-прежнему нарушает принцип открытого / закрытого.
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
Если будет новая история для Нью-Йорка, нам нужно добавить ее сюда.
2) после прочтения ссылки, прежде чем она действительно достигла лучшего решения, он использовал следующий код. :
class NySimpleFactory {
public function createToy($toyName) {
$toy = null;
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
return $toy;
}
}
class NyToysFactory {
public $simpleFactory;
public function __construct(SimpleFactory $simpleFactory) {
$this->simpleFactory = $simpleFactory;
}
public function produceToy($toyName) {
$toy = null;
$toy = $this->simpleFactory->createToy($toyName);
$toy->prepare();
$toy->package();
$toy->label();
return $toy;
}
}
Затем он говорит:
Разработчики быстро дорабатывают новый код и передают его фабрикам в США. Через две недели в офисе разработчиков начинает звонить телефон, потому что на заводе в Нью-Йорке возникли проблемы с производством. Оказывается, класс NyToysFactory был изменен разработчиками в удаленном филиале, потому что персонал не хочет выполнять работу по упаковке и маркировке. Они изменили produToy (), удалив его функции label () и package ().
Похоже, что Simple Factory в этом случае не сработает. Мы не хотим, чтобы филиалы в США могли изменять функции produToy (). ProduceToy () должен состоять из набора стандартных процедур, а ветви должны отвечать только за создание игрушек для конкретных мест. Что, если они могут создать абстрактный класс? И созданный ими абстрактный класс будет иметь конкретный метод produToy (), который будет реализовывать набор стандартных рабочих процедур, которым должны следовать все ветви. Внутри produToy () он вызывает собственный абстрактный метод createToy () для получения игрушечного класса. Таким образом createToy () может инкапсулировать создание объекта и, поскольку он абстрактный, делегирует создание своим подклассам.
Вопрос: а) Что это значит, когда говорится о передаче фабрики в США? б) или Мы не хотим, чтобы филиалы в США могли изменять функции produToy (). они все еще могут изменять функцию produToy, какая разница, если они не могут или могут ее изменить? Я просто не понимаю, почему простой завод вообще плох для следующего примера.
Не нужно читать об абстрактной фабрике по этой ссылке