Что такое билдер php

Что такое билдер php

Паттерн Builder является паттерном создания объектов (creational pattern). Суть его заключается в том, чтобы отделитьпроцесс создания некоторого сложного объекта от его представления. Таким образом, можно получать различныепредставления объекта, используя один и тот же “технологический” процесс.

Цель

Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процессаконструирования могут получаться разные представления.

Плюсы

  • позволяет изменять внутреннее представление продукта;
  • изолирует код, реализующий конструирование и представление;
  • дает более тонкий контроль над процессом конструирования.

Применение

  • алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как онистыкуются между собой;
  • процесс конструирования должен обеспечивать различные представления конструируемого объекта.

Паттерн проектирования Builder (Строитель) на PHP

1: 2:
3: class Phone
4: 5: private $_name ;
6: private $_os ;
7:
8: public function setName ( $name )
9: 10: $this -> _name = $name ;
11: >
12:
13: public function setOs ( $os )
14: 15: $this -> _os = $os ;
16: >
17: >
18:
19: abstract class BuilderPhone
20: 21: protected $_phone ;
22:
23: public function getPhone ()
24: 25: return $this -> _phone ;
26: >
27:
28: public function createPhone ()
29: 30: $this -> _phone = new Phone ();
31: >
32:
33: abstract public function buildName ();
34:
35: abstract public function buildOs ();
36: >
37:
38: class BuilderNexus4 extends BuilderPhone
39: 40: public function buildName ()
41: 42: $this -> _phone -> setName ( ‘Nexus4’ );
43: >
44:
45: public function buildOs ()
46: 47: $this -> _phone -> setOs ( «Android» );
48: >
49: >
50:
51: class BuilderIphone5 extends BuilderPhone
52: 53: public function buildName ()
54: 55: $this -> _phone -> setName ( ‘Iphone5’ );
56: >
57:
58: public function buildOs ()
59: 60: $this -> _phone -> setOs ( «iOs» );
61: >
62: >
63:
64: class Chooser
65: 66: private $_builderPhone ;
67:
68: public function setBuilderPhone ( BuilderPhone $mp )
69: 70: $this -> _builderPhone = $mp ;
71: >
72:
73: public function getPhone ()
74: 75: return $this -> _builderPhone -> getPhone ();
76: >
77:
78: public function constructPhone ()
79: 80: $this -> _builderPhone -> createPhone ();
81: $this -> _builderPhone -> buildName ();
82: $this -> _builderPhone -> buildOs ();
83: >
84: >
85:
86: $user = new Chooser ();
87: $google = new BuilderNexus4 ();
88: $apple = new BuilderIphone5 ();
89: $user -> setBuilderPhone ( $google );
90: $user -> constructPhone ();
91: $realPhone = $user -> getPhone (); // 🙂

Читайте также:  Распараллелить цикл на python

Источник

1.2. Строитель (Builder)

Строитель — это интерфейс для производства частей сложного объекта.

Иногда, если Строитель лучше знает о том, что он строит, этот интерфейс может быть абстрактным классом с методами по-умолчанию (адаптер).

Если у вас есть сложное дерево наследования для объектов, логично иметь сложное дерево наследования и для их строителей.

Примечание: Строители могут иметь текучий интерфейс, например, строитель макетов в PHPUnit.

1.2.2. Примеры

1.2.3. Диаграмма UML

Alt Builder UML Diagram

1.2.4. Код

Вы можете найти этот код на GitHub

 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder; 6 7use DesignPatterns\Creational\Builder\Parts\Vehicle; 8 9/** 10 * Director is part of the builder pattern. It knows the interface of the builder 11 * and builds a complex object with the help of the builder 12 * 13 * You can also inject many builders instead of one to build more complex objects 14 */ 15class Director 16 17 public function build(Builder $builder): Vehicle 18  19 $builder->createVehicle(); 20 $builder->addDoors(); 21 $builder->addEngine(); 22 $builder->addWheel(); 23 24 return $builder->getVehicle(); 25 > 26> 
 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder; 6 7use DesignPatterns\Creational\Builder\Parts\Vehicle; 8 9interface Builder 10 11 public function createVehicle(): void; 12 13 public function addWheel(): void; 14 15 public function addEngine(): void; 16 17 public function addDoors(): void; 18 19 public function getVehicle(): Vehicle; 20> 
 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder; 6 7use DesignPatterns\Creational\Builder\Parts\Door; 8use DesignPatterns\Creational\Builder\Parts\Engine; 9use DesignPatterns\Creational\Builder\Parts\Wheel; 10use DesignPatterns\Creational\Builder\Parts\Truck; 11use DesignPatterns\Creational\Builder\Parts\Vehicle; 12 13class TruckBuilder implements Builder 14 15 private Truck $truck; 16 17 public function addDoors(): void 18  19 $this->truck->setPart('rightDoor', new Door()); 20 $this->truck->setPart('leftDoor', new Door()); 21 > 22 23 public function addEngine(): void 24  25 $this->truck->setPart('truckEngine', new Engine()); 26 > 27 28 public function addWheel(): void 29  30 $this->truck->setPart('wheel1', new Wheel()); 31 $this->truck->setPart('wheel2', new Wheel()); 32 $this->truck->setPart('wheel3', new Wheel()); 33 $this->truck->setPart('wheel4', new Wheel()); 34 $this->truck->setPart('wheel5', new Wheel()); 35 $this->truck->setPart('wheel6', new Wheel()); 36 > 37 38 public function createVehicle(): void 39  40 $this->truck = new Truck(); 41 > 42 43 public function getVehicle(): Vehicle 44  45 return $this->truck; 46 > 47> 
 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder; 6 7use DesignPatterns\Creational\Builder\Parts\Door; 8use DesignPatterns\Creational\Builder\Parts\Engine; 9use DesignPatterns\Creational\Builder\Parts\Wheel; 10use DesignPatterns\Creational\Builder\Parts\Car; 11use DesignPatterns\Creational\Builder\Parts\Vehicle; 12 13class CarBuilder implements Builder 14 15 private Car $car; 16 17 public function addDoors(): void 18  19 $this->car->setPart('rightDoor', new Door()); 20 $this->car->setPart('leftDoor', new Door()); 21 $this->car->setPart('trunkLid', new Door()); 22 > 23 24 public function addEngine(): void 25  26 $this->car->setPart('engine', new Engine()); 27 > 28 29 public function addWheel(): void 30  31 $this->car->setPart('wheelLF', new Wheel()); 32 $this->car->setPart('wheelRF', new Wheel()); 33 $this->car->setPart('wheelLR', new Wheel()); 34 $this->car->setPart('wheelRR', new Wheel()); 35 > 36 37 public function createVehicle(): void 38  39 $this->car = new Car(); 40 > 41 42 public function getVehicle(): Vehicle 43  44 return $this->car; 45 > 46> 
 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7abstract class Vehicle 8  9 final public function setPart(string $key, object $value) 10  11 > 12> 
1 2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7class Truck extends Vehicle 8 9> 
1 2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7class Car extends Vehicle 8 9> 
1 2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7class Engine 8 9> 
1 2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7class Wheel 8 9> 
1 2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Parts; 6 7class Door 8 9> 

1.2.5. Тест

 1  2 3declare(strict_types=1); 4 5namespace DesignPatterns\Creational\Builder\Tests; 6 7use DesignPatterns\Creational\Builder\Parts\Car; 8use DesignPatterns\Creational\Builder\Parts\Truck; 9use DesignPatterns\Creational\Builder\TruckBuilder; 10use DesignPatterns\Creational\Builder\CarBuilder; 11use DesignPatterns\Creational\Builder\Director; 12use PHPUnit\Framework\TestCase; 13 14class DirectorTest extends TestCase 15 16 public function testCanBuildTruck() 17  18 $truckBuilder = new TruckBuilder(); 19 $newVehicle = (new Director())->build($truckBuilder); 20 21 $this->assertInstanceOf(Truck::class, $newVehicle); 22 > 23 24 public function testCanBuildCar() 25  26 $carBuilder = new CarBuilder(); 27 $newVehicle = (new Director())->build($carBuilder); 28 29 $this->assertInstanceOf(Car::class, $newVehicle); 30 > 31> 

© Copyright 2011-2020, Dominik Liebler and contributors. Ревизия 9e2553fe .

Источник

Оцените статью