建造者模式(Builder Pattern)

定义

使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

作用

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

使用场景

制造汽车。

优、缺点

优点:

建造者独立,易扩展;
便于控制细节风险。

缺点:

产品必须有共同点,范围有限制;
如内部变化复杂,会有很多的建造类。

模式结构

(略)

### 示例类图

建造者模式包含几个角色:

  • Builder:抽象建造者类,规范产品的组件,一般是由子类实现。
  • ConcreteBuilder:具体建造者类,实现抽象类定义的所有方法,并且返回一个组建好的对象。
  • Director:指挥者(组装者)类,负责安排已有模块的顺序,然后告诉Builder开始建造。
  • Product:产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法。

:-:

示例代码

  • 产品类 (Product)
class Car  
{
    public $name;  
    public $engine;//发动机  
    public $chassis;//底盘  
    public $body;//车身  
    public $equipment;//电器设备  

    public function setName($name)  
    {  
        $this->name = $name;  
    }  

    public function setEngine($engine)  
    {  
        $this->engine = $engine;  
    }  

    public function setChassis($chassis)  
    {  
        $this->chassis = $chassis;  
    }  

    public function setBody($body)  
    {  
        $this->body = $body;  
    }  

    public function setEquipment($equipment)  
    {  
        $this->equipment = $equipment;  
    }  

    public function show()  
    {  
        echo "名称:".$this->name."\r\n";  
        echo "引擎:".$this->engine."\r\n";  
        echo "底盘:".$this->chassis."\r\n";  
        echo "车身:".$this->body."\r\n";  
        echo "电子设备:".$this->equipment."\r\n";  

    }  
}
  • 抽象建造者类 (Builder)
interface IBuilder  
{
    public function builderName();  
    public function builderEngine();  
    public function builderChassis();  
    public function builderBody();  
    public function builderEquipment();  
    public function getCar();  
}
  • 具体建造者类 (ConcreteBuilder)
// 宝马车builder  
class BMWBuilder implements IBuilder  
{ 
    public $car;  

    public function __construct()  
    {  
        $this->car = new Car();  
    }  

    public function builderName()  
    {  
        $this->car->setName('宝马');   
    }  

    public function builderEngine()  
    {  
        $this->car->setEngine('德国发动机');   
    }  

    public function builderChassis()  
    {  
        $this->car->setChassis('超大底盘');   
    }  

    public function builderBody()  
    {  
        $this->car->setBody('超大');   
    }  
    public function builderEquipment()  
    {  
        $this->car->setEquipment('电子设备');   
    }  

    public function getCar()  
    {  
        return $this->car;  
    }  

}
// 本田车builder  
class HondaBuilder implements IBuilder  
{  
    public $car;  

    public function __construct()  
    {  
        $this->car = new Car();  
    }  

    public function builderName()  
    {  
        $this->car->setName('本田');   
    }  

    public function builderEngine()  
    {  
        $this->car->setEngine('日本发动机');   
    }  

    public function builderChassis()  
    {  
        $this->car->setChassis('小底盘');   
    }  

    public function builderBody()  
    {  
        $this->car->setBody('小');   
    }  
    public function builderEquipment()  
    {  
        $this->car->setEquipment('电子设备');   
    }  

    public function getCar()  
    {  
        return $this->car;  
    }  
}
  • 组装者类 (Director)
// 组装者(director)  
class CarDirector  
{
    public function make(IBuilder $builder)  
    {  
        $builder->builderName();  
        $builder->builderEngine();  
        $builder->builderChassis();  
        $builder->builderBody();  
        $builder->builderEquipment();  
        return $builder->getCar();  
    }  
}
  • 客户端调用
class Client  
{
    public static function main($argv)  
    {  
        $director = new CarDirector();   
        $bmwBuilder = new BMWBuilder();  
        $car = $director->make($bmwBuilder);  
        $car->show();  

        echo "\r\n";  
        $hondaBuilder = new HondaBuilder();  
        $car = $director->make($hondaBuilder);  
        $car->show();  
    }  
}

Client::main($argv); 
  • 运行结果
名称:宝马
引擎:德国发动机
底盘:超大底盘
车身:超大
电子设备:电子设备

名称:本田
引擎:日本发动机
底盘:小底盘
车身:小
电子设备:电子设备

注意事项

  • 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

猜你喜欢

转载自blog.csdn.net/jacksunmico/article/details/80641885