T ЕГО КОД / ПРОБЛЕМА не отображает абстрактный фабричный или фабричный метод.Принятие решения о том, какой класс создавать экземпляром путем включения параметра, действительно является анти-паттерном, поощряющим нарушение принципа открытого-закрытого типа.
Абстрактная фабрика
Абстрактная фабрика - это все о принудительном применении семейства связанных классов:
abstract class ToyFactory
+ createBear(): ToyBear
+ createElephant(): ToyElephant
class USToyFactory extends ToyFactory
+ createBear(): ToyBear -> creates USToyBear
+ createElephant(): ToyElephant -> USToyElephant
abstract class ToyBear
+ playSound()
class USToyBear extends ToyBear
+ playSound()//play US National Anthem
Передача USToyFactory, где ожидается ToyFactory, обеспечивает создание американских игрушек (USToyBear и USToyElephant) - это сила абстрактной фабрики.
Обратите внимание, что продукты , медведи, слоны и т. Д., Известны как AoT (раньше времени).
Фабричный метод
Фабричный метод - это всеоб отсрочке создания экземпляров для подклассов.
abstract class Dashboard
+ createWidget(): Widget
abstract class Widget
+ config()
class StatsDashboard extends Dashboard
+ createWidget: Widget -> return new StatsWidget()
class StatsWidget extends Widget
Вызов createWidget () возвращает виджет, но какой конкретный виджет для возврата должен быть отложен до подклассов (StatsDashboard возвращает StatsWidget).
Обратите внимание, что методы создания объявленывверх по дереву наследования, но они выполняются по дереву наследования.
reader Читатель с острым взглядом увидит, что абстрактные фабричные методы напоминают фабричные методы, совпадение?- нетИменно здесь и происходит имя фабричного метода (они выполняют конкретную реализацию класса).
Допущена путаница с «фабриками в США»;это плохой выбор слов.Автор намекает, что этот код может быть передан фабричным рабочим, что совершенно не имеет значения и вводит в заблуждение относительно фабричных шаблонов.
Чтобы разрешить описанный выше переключатель, вам нужно понять очевидное: каждое условиеОбработчик связан каким-то образом.В этом случае все они являются игрушками.
public function createToy($toyName) {
$toy = null;
if ('car'==$toyName) {
$toy = new NyCar();//I'm a Toy
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();//I'm a Toy
}
return $toy;
}
Используя полиморфизм, мы можем удовлетворить принцип открытого-закрытого, создав набор классов-братьев:
abstract class Toy
+ operate()
Car extends Toy
Helicopter extends Toy
some_toy.operate();
Добавление к коммутаторуСлучаи - не что иное, как создание другого класса родного брата.
Внедрение зависимостей следует использовать для создания конкретной игрушки.
Надеюсь, это поможет!