Абстрактная фабрика на php
дата публикации: 2016-04-20

Паттерн абстрактная фабрика является одним из самых известных среди порождающих паттернов, поэтому обойти его вниманием никак нельзя. Вначале я его путал с паттерном фабричный метод, только спустя некоторое время, когда столкнулся на практике - разобрался. Итак, приведу код, а далее коротко поясню что и к чему.

//файл classes.php
//интерфейс, регламентирующий поведение объекта "Дверь"
interface door {
  public function constructDoor($x, $y);
}
//класс, описывающий поведение объекта "Деревянная дверь"
class woodenDoor implements door {
  public function constructDoor($x, $y) {
    print "It is wooden door with width = $x and height = $y<br ?-->";
  }
}
//класс, описывающий поведение объекта "Пластиковая дверь"
class plasticDoor implements door {
  public function constructDoor($x, $y) {
    print "It is plastic door with width = $x and height = $y
"; } } //интерфейс, регламентирующий поведение объекта "Окно" interface window { public function constructWindow($x, $y); } //класс, описывающий поведение объекта "Деревянное окно" class woodenWindow implements window { public function constructWindow($x, $y) { print "It is wooden window with width = $x and height = $y
"; } } //класс, описывающий поведение объекта "Пластиковое окно" class plasticWindow implements window { public function constructWindow($x, $y) { print "It is plastic window with width = $x and height = $y
"; } } //интерфейс, регламентирующий сборку объекта "Дом" interface house { public function constructDoor($x, $y); public function constructWindow($x, $y); } //интерфейс, совершающий сборку объекта "Дом с деревянными окнами и дверями" class woodenHouse implements house { protected $door; protected $window; public function __construct() { print "House with wooden elements was created
"; $this->door = new woodenDoor(); $this->window = new woodenWindow(); } public function constructDoor($x, $y) { $this->door->constructDoor($x, $y); } public function constructWindow($x, $y) { $this->window->constructWindow($x, $y); } } //интерфейс, совершающий сборку объекта "Дом с пластиковыми окнами и дверями" class plasticHouse implements house { protected $door; protected $window; public function __construct() { print "House with plastic elements was created
"; $this->door = new plasticDoor(); $this->window = new plasticWindow(); } public function constructDoor($x, $y) { $this->door->constructDoor($x, $y); } public function constructWindow($x, $y) { $this->window->constructWindow($x, $y); } } //файл index.php include 'classes.php'; $woodenHouse = new woodenHouse(); $woodenHouse->constructDoor(1.20,2.70); $woodenHouse->constructWindow(1.05,1.10); $plasticHouse = new plasticHouse(); $plasticHouse->constructDoor(1.50,3.00); $plasticHouse->constructWindow(1.20,1.00);

В результате на экран будет выведено следующее:

House with wooden elements was created
It is wooden door with width = 1.2 and height = 2.7
It is wooden window with width = 1.05 and height = 1.1
House with plastic elements was created
It is plastic door with width = 1.5 and height = 3
It is plastic window with width = 1.2 and height = 1

В данном примере мы автоматизировали создание объекта (дома) с деревянными окнами и дверями, а так же пластиковыми окнами и дверями. Причем конечный пользователь ничего не знает о том, как производится сборка дома, об этом "знает" абстрактная фабрика. Пользователь создает дом, при этом вызывается фабрика, которая уже по известному проекту собирает конструкцию. Для того, чтобы добавить в наш дом, скажем, деревянные двери, нам достаточно сначала разработать этот класс, а далее прописать его в интерфейсе и реализации фабрики.

Абстрактная фабрика может быть представлена как большой механический робот, который создает комплексный объект, пользуясь заранее разработанными блоками. Сама абстрактная фабрика, в отличие от паттерна строитель, не вмешивается в поведение блоков, которые являются законченными структурами и используются как элементы конструктора лего. На этапе конструирования конкретных фабрик вполне возможно по желанию создавать любой набор блоков. Это чем то напоминает детей, которые играют в песочнице и выбирают друг другу разный набор формочек для фигур из песка. После чего каждый ребенок может строить свой город, пользуясь готовыми формочками. Родители могут принести детям новые формочки и после их дележки между конкретными фабриками (детьми), в городе будут появляться новые объекты.

Не стоит применять фабрику в очень простых проектах, так как чаще всего это не требуется и можно все реализовать без нее. Однако если проект предполагает развитие, то без этого паттерна не обойтись.