建造者模式:
造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
目的:
消除其他对象复杂的创建过程
建造者模式包含如下角色:
1.产品角色,产品角色定义自身的组成属性
2.抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
3.具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
4.指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
UML图:
//代码实现:
<?php class People{ public $head; public $body; //不太此类中直接给属性赋值 function __construct(){ } } //定义具备建造者所需实现的方法 abstract class PeopleBuilder{ abstract function buildHead(); abstract function buildBody(); } //具体建造类实现具体业务 class ChildBuilder extends PeopleBuilder{ private $people; function __construct(){ $this->people = new people; } function buildHead(){ echo "this is a child's head!"; } function buildBody(){ echo "this is a child's body!"; } function returnResult(){ return $this->people; } } class AdultBuilder extends PeopleBuilder{ private $people; function __construct(){ $this->people = new people; } function buildHead(){ echo "this is a adult's head!"; } function buildBody(){ echo "this is a adult's body!"; } function returnResult(){ return $this->people; } } //指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品 class Director{ function __construct(Peoplebuilder $builder){ $builder->buildHead(); $builder->buildBody(); } } //测试 $builder = new AdultBuilder(); $director = new Director($builder); $person = $builder->returnResult(); //this is a adult's head! this is a adult's body! ?>
优点:
建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易。
缺点:
建造者接口的修改会导致所有执行类的修改。
适用场景:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过 程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客 户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。