Этот пример возвращает объект типа Mac
и он никогда не может быть ничего другого:
$mac = new Mac();
Это не может быть подклассом Mac
, не может быть классом, который соответствует интерфейсу Mac
.
Принимая во внимание, что в следующем примере может быть возвращен объект типа Mac
или какой-либо другой тип, который принимает заводское решение.
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
Вы могли бы хотеть набор подклассов Mac
, каждая из которых представляет собой другую модель Mac. Затем вы пишете код на заводе, чтобы решить, какой из этих подклассов использовать. Вы не можете сделать это с помощью оператора new
.
Таким образом, завод дает вам больше гибкости при создании объектов. Гибкость часто идет рука об руку с развязкой.
Re ваш комментарий: Я бы не сказал, никогда использование new
. Фактически, я использую new
для большинства простых создания объектов. Но это не имеет никакого отношения к тому, кто пишет код клиента. Заводская модель предназначена для тех случаев, когда вам нужна архитектура, которая может выбрать класс для динамического создания экземпляра.
В вашем примере Apple Store вам, вероятно, понадобится простой код для создания продукта и его добавления в корзину. Если вы используете new
, и у вас есть разные типы объектов для каждого типа продукта, вам нужно написать огромный оператор case
, чтобы вы могли сделать объект new
соответствующего типа. Каждый раз, когда вы добавляете тип продукта, вам нужно будет обновить этот оператор case
. И вы можете иметь несколько из этих case
заявлений в других частях приложения.
Используя фабрику, у вас будет только одно место для обновления, которое знает, как принять параметр и создать экземпляр нужного типа объекта. Все места в вашем приложении будут неявно получать поддержку для нового типа без необходимости изменения кода. Это победа, будь вы единственным разработчиком или вы работаете в команде.
Но вам также не нужна фабрика, если вам не нужно поддерживать различные подтипы. Просто продолжайте использовать new
в простых случаях.
Этот второй кажется скорее отношением, а не фабрикой для меня ...? – SeanJA