Нам говорят, что в большинстве тем для объяснения моделей фабрики фабрики необходимы, чтобы отказаться от использования new
для создания экземпляров объектов. Вместо этого нам нужно создать фабрики с new
, что сделать new
для конкретных объектов для нас.
Но почему? В этом случае у нас просто избыточный средний класс.
Например здесь
В моем коде я использую этот способ. Это фабрика? Это правильный путь?
<?php
abstract class CarAbstract
{
abstract public function makeSignal();
public static function factory($type)
{
switch($type) {
'automobile':
return new AutoCar();
break;
'truck':
return new TruckCar();
break;
}
}
}
class AutoCar extends CarAbstract {
public function makeSignal()
{
return 'beep-beep';
}
}
class TruckCar extends CarAbstract {
public function makeSignal()
{
return 'faa-faa';
}
}
$auto = CarAbstract::factory('automobile');
$truck = CarAbstract::factory('truck');
$auto->makeSignal(); // beep-beep
$truck->makeSignal(); // faa-faa
Постскриптум
Извините за мой английский
Страница Википедии, на которую вы ссылаетесь, объясняет, почему:
Шаблон проектирования Factory Method решает следующие проблемы:
Как можно создать объект, чтобы подклассы могли переопределить, какой класс создавать?
Как класс может отложить создание экземпляров для подклассов?
Лично наиболее полезная ситуация, с которой я столкнулся в PHP для фабрик, — это реализация библиотек. Это вопрос мнения, но я считаю, что фабрики, как правило, чрезмерны в ядре моих PHP-приложений. Но при написании библиотеки, которая будет использоваться несколькими приложениями, она обеспечивает большую гибкость в предоставлении конкретных реализаций.
Приведенный вами пример будет работать, но это не лучший способ реализации шаблона. Обычно лучше создать конкретный заводской класс, который вы создаете. Или даже лучше интерфейс, который вы затем реализуете. Тогда это полезнее и проще для модульного тестирования.
Заводской шаблон полезен, когда фактический тип объекта определяется динамически.
$carType = $_POST['type'];
$cat = CarAbstract::factory($carType);
Это позволяет вам реализовать switch
оператор один раз в базовом классе, вместо того, чтобы кодировать его во всех приложениях, которые используют эти классы. И если вы добавите больше подклассов, вы просто обновите этот switch
утверждение, вместо того, чтобы найти всех звонящих.