企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 定义 使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 ### 作用 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 ### 使用场景 制造汽车。 ### 优、缺点 优点: 建造者独立,易扩展; 便于控制细节风险。 缺点: 产品必须有共同点,范围有限制; 如内部变化复杂,会有很多的建造类。 ### 模式结构 (略) ### 示例类图 建造者模式包含几个角色: * Builder:抽象建造者类,规范产品的组件,一般是由子类实现。 * ConcreteBuilder:具体建造者类,实现抽象类定义的所有方法,并且返回一个组建好的对象。 * Director:指挥者(组装者)类,负责安排已有模块的顺序,然后告诉Builder开始建造。 * Product:产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法。 :-: ![](https://box.kancloud.cn/a3147c7e4318334cbbeb71fdd3ee155b_506x463.bmp) ### 示例代码 * 产品类 (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); ``` * 运行结果 ``` 名称:宝马 引擎:德国发动机 底盘:超大底盘 车身:超大 电子设备:电子设备 名称:本田 引擎:日本发动机 底盘:小底盘 车身:小 电子设备:电子设备 ``` * * * * * ### 注意事项 * 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。