概念
也叫生成器模式,建造型模式用于创建过程稳定,但配置多变的对象。在《设计模式》一书中的定义是:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要用来通过链式调用生成不同的配置。
使用场景
1. 需要生成的产品对象有复杂的内部结构。
2. 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3. 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
优势
1. 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2. 每一个Builder都相对独立,而与其它的Builder(独立控制逻辑)无关。
3. 模式所建造的最终产品更易于控制。
缺点
1. 建造者接口的修改会导致所有执行类的修改。
示例
<?php /** * 定义一个动物模型类 */ abstract class PetModel { /** * 动物名字 * * @var string */ public $petname = ''; /** * 动物会的技能 * * @var array */ public $petskills = []; /** * 会唱歌 * * @access public */ public abstract function skillsSing(); /** * 会跳舞 * * @access public */ public abstract function skillsDance(); /** * 会跑步 * * @access public */ public abstract function skillsRunning(); /** * 获取动物 * * @access public * @return void */ final public function getPet($petname) { // 获取动物名称 $this->petname = $petname; if (!empty($this->petskills)) { // 赋值技能 foreach ($this->petskills as $value) { // 获取技能名称 $skillName = 'skills' . $value; // 执行方法 $this->$skillName(); } } } } /** * 狗类 */ class DogPetModel extends PetModel { /** * 技能栏 * * @var array */ public $petskills = []; /** * 唱歌 * * @access public */ public function skillsSing() { echo $this->petname . '会唱歌<br>'; } /** * 跳舞 * * @access public */ public function skillsDance() { echo $this->petname . '会跳舞<br>'; } /** * 跑步 * * @access public */ public function skillsRunning() { echo $this->petname . '会跑步<br>'; } } /** * 定义建造者 */ abstract class PetBuilder { /** * 获取模型 * * @access public * @param string $name 动物名称 * @param array $skills 动物能力 */ public abstract function getPetModel($name, $skills); } /** * 狗类 */ class DogPetBuilder extends PetBuilder { /** * 设置保存实例的变量 * * @var self */ private $model = ''; /** * 构造函数 * * @access public * @return void */ public function __construct() { // 实例化类 $this->dogPetModel = new DogPetModel(); } /** * 获取动物实例 * * @access public * @param string $name 动物名称 * @param array $skills 动物能力 * @return void */ public function getPetModel($name, $skills = []) { // 赋值能力 $this->dogPetModel->petskills = $skills; // 实例化动物 $this->dogPetModel->getPet($name); } } // 实例化 Dog 建造者类 $dog = new DogPetBuilder(); // 获取第一只小狗 $dog1 = $dog->getPetModel('Dog1', [ 'Sing', 'Dance', 'Running' ]); // 获取第二只小狗 $dog2 = $dog->getPetModel('Dog2', [ 'Sing', 'Dance' ]);
从这里我们可以看出,建造者模式,跟工厂模式很相似,只是比工厂模式仅仅多了一个“导演类”的角色(Director,也就是代码中的 PetModel 抽象类)。那为什么还要有建造者模式呢?
建造者模式主要是用来创建更为复杂的对象,因为对象的创建过程更为复杂,所以需要一个新的导演类(Director),建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
- 本文固定链接: https://phpmianshi.com/?id=125
- 转载请注明: admin 于 PHP面试网 发表
《本文》有 0 条评论