建造者模式
概念
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。
<?php
//创建一个食物条目和食物包装的接口
interface Item{
public function name();
public function packing();
public function price();
}
interface Packing{
public function pack();
}
//创建pack的实体类
class Wrapper implements Packing{
public function pack()
{
return "Wrapper";
}
}
//创建瓶子类
class Bottle implements Packing{
public function pack()
{
// TODO: Implement pack() method.
return "Bottle";
}
}
//汉堡包
abstract class Burger implements Item{
public function packing()
{
// TODO: Implement packing() method.
return new Wrapper();
}
public abstract function price();
}
abstract class ColdDrink implements Item{
public function packing()
{
// TODO: Implement packing() method.
return new Bottle();
}
public abstract function price();
}
class VegBurger extends Burger{
public function price()
{
// TODO: Implement price() method.
return 20.5;
}
public function name()
{
// TODO: Implement name() method.
return "Veg Burger";
}
}
class ChickenBurger extends Burger{
public function price()
{
// TODO: Implement price() method.
return "50.5";
}
public function name()
{
return "chicken burger";
}
}
class Coke extends ColdDrink{
public function price()
{
// TODO: Implement price() method.
return 30.3;
}
public function name()
{
return "Coke";
}
}
class Pepsi extends ColdDrink{
public function price()
{
// TODO: Implement price() method.
return 35.0;
}
public function name()
{
// TODO: Implement name() method.
return "Pepsi";
}
}
class Meal{
private $list = [];
public function addItem($item)
{
$this->list[] = $item;
}
public function cost()
{
$cost = 0.0;
foreach ($this->list as $value)
{
$cost += $value["price"];
}
return $cost;
}
public function showItems()
{
foreach ($this->list as $value)
{
var_dump($value->name());
var_dump($value->price());
var_dump($value->packing());
}
}
}
class MealBuilder{
public function prepareVegMeal()
{
$meal = new Meal();
$meal->addItem(new VegBurger());
$meal->addItem(new Pepsi());
return $meal;
}
public function prepareNonVegMeal()
{
$meal = new Meal();
$meal->addItem(new ChickenBurger());
$meal->addItem(new Coke());
return $meal;
}
}
$meal = new MealBuilder();
$obj = $meal->prepareNonVegMeal();
$obj->showItems();