Этот пример возвращает объект типа 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
в простых случаях.