#MOC
複雑なオブジェクトの構築をより直観的で順序に依存しないものにするための[[🗃️デザインパターン]]
```mermaid
classDiagram
PizzaBuilder <|.. CheesePizzaBuilder
Waiter --> PizzaBuilder
PizzaBuilder : createNewPizza()
PizzaBuilder : buildSize()
PizzaBuilder : buildCheese()
PizzaBuilder : buildPepperoni()
PizzaBuilder : buildTomato()
PizzaBuilder : getPizza()
class Waiter{
setPizzaBuilder(PizzaBuilder)
getPizza()
constructPizza()
}
```
```php
class Pizza
{
protected $size;
protected $cheese;
protected $pepperoni;
protected $tomato;
public function setPart($name, $value) {
$this->$name = $value;
}
}
interface PizzaBuilder
{
public function createNewPizza();
public function buildSize();
public function buildCheese();
public function buildPepperoni();
public function buildTomato();
public function getPizza();
}
class CheesePizzaBuilder implements PizzaBuilder
{
private $pizza;
public function createNewPizza() {
$this->pizza = new Pizza();
}
public function buildSize() {
$this->pizza->setPart('size', 'large');
}
public function buildCheese() {
$this->pizza->setPart('cheese', 'mozzarella');
}
public function buildPepperoni() {
// No pepperoni for cheese pizza
}
public function buildTomato() {
$this->pizza->setPart('tomato', 'yes');
}
public function getPizza() {
return $this->pizza;
}
}
class Waiter
{
private $pizzaBuilder;
public function setPizzaBuilder(PizzaBuilder $pb) {
$this->pizzaBuilder = $pb;
}
public function getPizza() {
return $this->pizzaBuilder->getPizza();
}
public function constructPizza() {
$this->pizzaBuilder->createNewPizza();
$this->pizzaBuilder->buildSize();
$this->pizzaBuilder->buildCheese();
$this->pizzaBuilder->buildPepperoni();
$this->pizzaBuilder->buildTomato();
}
}
$waiter = new Waiter();
$waiter->setPizzaBuilder(new CheesePizzaBuilder());
$waiter->constructPizza();
$pizza = $waiter->getPizza();
```
## 📚ドキュメント
- [7. Builder パターン | TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/Builder)
## 📖ノウハウ
## 💁トラブルシューティング