💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# 创建者模式 指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示 创建者模式中,客户端不再负责对象的创建与组装,而是把这个对象创建的责任交给其具体的创建者类,把组装的责任交给组装类,客户端支只负责对象的调用,从而明确了各个类的职责 例如,计算机是由 OPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员 如游戏中的不同角色,其性别、个性、能力、脸型、体型、服装、发型等特性都有所差异 还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮件的发件人、收件人、主题、内容、附件等内容也各不相同 **主要优点如下:** 1. 各个具体的建造者相互独立,有利于系统的扩展。 2. 客户端不必知道产品内部组成的细节,便于控制细节风险。 **其缺点如下:** 1. 产品的组成部分必须相同,这限制了其使用范围。 2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。 **以下情况应当使用建造者模式:** 1、 需要生成的产品对象有复杂的内部结构。 2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。 3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。 **建造者模式的效果:** 1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。 2、 每一个Builder都相对独立,而与其它的Builder(独立控制逻辑)无关。 3、 模式所建造的最终产品更易于控制。 **具体场景举例:** 在很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计, 通过不同的具体建造者创建不同类型的地图或人物 > 建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而[工厂方法模式](http://c.biancheng.net/view/1348.html)更注重零部件的创建过程,但两者可以结合使用 ![](https://img.kancloud.cn/46/4b/464b1c7f6b750f40732fbcf413c26e00_611x641.png) ``` <pre class="calibre10">``` class <span class="token4">person</span> <span class="token3">{</span> public $age<span class="token3">;</span> public $speed<span class="token3">;</span> public $knowledge<span class="token3">;</span> <span class="token3">}</span> <span class="token">//抽象建造者类</span> abstract class <span class="token4">Builder</span><span class="token3">{</span> public $_person<span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">setAge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">setSpeed</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">setKnowledge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>Person $person<span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">=</span>$person<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">getPerson</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//长者建造者</span> class <span class="token4">OlderBuider</span> extends <span class="token4">Builder</span><span class="token3">{</span> public <span class="token5">function</span> <span class="token4">setAge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>age<span class="token1">=</span><span class="token6">70</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setSpeed</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>speed<span class="token1">=</span><span class="token2">"low"</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setKnowledge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>knowledge<span class="token1">=</span><span class="token2">'more'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//小孩建造者</span> class <span class="token4">ChildBuider</span> extends <span class="token4">Builder</span><span class="token3">{</span> public <span class="token5">function</span> <span class="token4">setAge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>age<span class="token1">=</span><span class="token6">10</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setSpeed</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>speed<span class="token1">=</span><span class="token2">"fast"</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setKnowledge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_person<span class="token1">-</span><span class="token1">></span>knowledge<span class="token1">=</span><span class="token2">'litte'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//建造指挥者</span> class <span class="token4">Director</span><span class="token3">{</span> private $_builder<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>Builder $builder<span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_builder <span class="token1">=</span> $builder<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">built</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_builder<span class="token1">-</span><span class="token1">></span><span class="token4">setAge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>_builder<span class="token1">-</span><span class="token1">></span><span class="token4">setSpeed</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>_builder<span class="token1">-</span><span class="token1">></span><span class="token4">setKnowledge</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//实例化一个长者建造者</span> $oldB <span class="token1">=</span> <span class="token5">new</span> <span class="token4">OlderBuider</span><span class="token3">(</span><span class="token5">new</span> <span class="token4">Person</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//实例化一个建造指挥者</span> $director <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Director</span><span class="token3">(</span>$oldB<span class="token3">)</span><span class="token3">;</span> <span class="token">//指挥建造</span> $director<span class="token1">-</span><span class="token1">></span><span class="token4">built</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//得到长者</span> $older <span class="token1">=</span> $oldB<span class="token1">-</span><span class="token1">></span><span class="token4">getPerson</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$older<span class="token3">)</span><span class="token3">;</span> ``` ``` 购物车: ``` <pre class="calibre10">``` <span class="token">//购物车 (product)</span> class <span class="token4">ShoppingCart</span> <span class="token3">{</span> # 选中的商品 private $_goods <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> # 使用的优惠券 private $_tickets <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> # 商品赋值 public <span class="token5">function</span> <span class="token4">addGoods</span><span class="token3">(</span>$goods<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_goods<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> $goods<span class="token3">;</span> <span class="token3">}</span> # 优惠券赋值 public <span class="token5">function</span> <span class="token4">addTicket</span><span class="token3">(</span>$ticket<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_tickets<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> $ticket<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">printInfo</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> # builder<span class="token3">:</span>goods<span class="token3">:</span><span class="token3">(</span>衣服<span class="token3">,</span>鞋子<span class="token3">)</span><span class="token3">,</span> tickets<span class="token3">:</span><span class="token3">(</span>减<span class="token6">10</span><span class="token3">)</span> <span class="token4">printf</span><span class="token3">(</span><span class="token2">"goods:(%s), tickets:(%s)"</span><span class="token3">,</span> <span class="token4">implode</span><span class="token3">(</span><span class="token2">','</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>_goods<span class="token3">)</span><span class="token3">,</span> <span class="token4">implode</span><span class="token3">(</span><span class="token2">','</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>_tickets<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//假如我们要还原购物车的东西,比如用户关闭浏览器后再打开时会根据cookie还原 </span> $data <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span> <span class="token2">'goods'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span><span class="token2">'衣服'</span><span class="token3">,</span> <span class="token2">'鞋子'</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'tickets'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span><span class="token2">'减10'</span><span class="token3">)</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">;</span> # 如果不使用创建者模式,则需要业务类里一步步还原购物车 <span class="token">/* $cart = new ShoppingCart(); foreach ($data['goods'] as $goods) { $cart->addGoods($goods); } foreach ($data['tickets'] as $ticket) { $cart->addTicket($ticket); } $cart->printInfo(); exit; */</span> <span class="token">//我们提供创建者类来封装购物车的数据组装 (比工厂模式多了一个“导演类”的角色 ) </span> class <span class="token4">CardBuilder</span> <span class="token3">{</span> private $_card<span class="token3">;</span> <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$card<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_card <span class="token1">=</span> $card<span class="token3">;</span> <span class="token3">}</span> <span class="token5">function</span> <span class="token4">build</span><span class="token3">(</span>$data<span class="token3">)</span> <span class="token3">{</span> foreach <span class="token3">(</span>$data<span class="token3">[</span><span class="token2">'goods'</span><span class="token3">]</span> as $goods<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_card<span class="token1">-</span><span class="token1">></span><span class="token4">addGoods</span><span class="token3">(</span>$goods<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> foreach <span class="token3">(</span>$data<span class="token3">[</span><span class="token2">'tickets'</span><span class="token3">]</span> as $ticket<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_card<span class="token1">-</span><span class="token1">></span><span class="token4">addTicket</span><span class="token3">(</span>$ticket<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">function</span> <span class="token4">getCrad</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>_card<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $cart <span class="token1">=</span> <span class="token5">new</span> <span class="token4">ShoppingCart</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $builder <span class="token1">=</span> <span class="token5">new</span> <span class="token4">CardBuilder</span><span class="token3">(</span>$cart<span class="token3">)</span><span class="token3">;</span> $builder<span class="token1">-</span><span class="token1">></span><span class="token4">build</span><span class="token3">(</span>$data<span class="token3">)</span><span class="token3">;</span> echo <span class="token2">"after builder:"</span><span class="token3">;</span> $cart<span class="token1">-</span><span class="token1">></span><span class="token4">printInfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> ###### 进阶 <span class="token">/** * * 产品本身 */</span> class <span class="token4">ShoppingCart</span> <span class="token3">{</span> public $_goods<span class="token3">;</span> public $_tickets<span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 建造者抽象类 * */</span> abstract class <span class="token4">Builder</span> <span class="token3">{</span> public abstract <span class="token5">function</span> <span class="token4">buildGoods</span><span class="token3">(</span>$goods<span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">buildTicket</span><span class="token3">(</span>$tickets<span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">getResult</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * * 具体建造者 * 实现其具体方法 */</span> class <span class="token4">CartBuilder</span> extends <span class="token4">Builder</span> <span class="token3">{</span> private $_product<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>ShoppingCart $product<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_product <span class="token1">=</span> <span class="token5">new</span> <span class="token4">ShoppingCart</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">buildGoods</span><span class="token3">(</span>$goods<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_product<span class="token1">-</span><span class="token1">></span>_goods<span class="token1">=</span>$goods<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">buildTicket</span><span class="token3">(</span>$tickets<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_product<span class="token1">-</span><span class="token1">></span>_tickets<span class="token1">=</span>$tickets<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">getResult</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>_product<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">/** * * 并不知道具体实现细节 只需要指挥具体建造者建造 */</span> class <span class="token4">Director</span> <span class="token3">{</span> private $_builder<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>Builder $builder<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_builder <span class="token1">=</span> $builder<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">built</span><span class="token3">(</span>$data<span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_builder<span class="token1">-</span><span class="token1">></span><span class="token4">buildGoods</span><span class="token3">(</span>$data<span class="token3">[</span><span class="token2">'goods'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>_builder<span class="token1">-</span><span class="token1">></span><span class="token4">buildTicket</span><span class="token3">(</span>$data<span class="token3">[</span><span class="token2">'tickets'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $data <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span> <span class="token2">'goods'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span><span class="token2">'衣服'</span><span class="token3">,</span> <span class="token2">'鞋子'</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'tickets'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span><span class="token2">'减10'</span><span class="token3">)</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">;</span> <span class="token">// client </span> $buidler <span class="token1">=</span> <span class="token5">new</span> <span class="token4">CartBuilder</span><span class="token3">(</span><span class="token5">new</span> <span class="token4">ShoppingCart</span><span class="token3">)</span><span class="token3">;</span> $director <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Director</span><span class="token3">(</span>$buidler<span class="token3">)</span><span class="token3">;</span> $director<span class="token1">-</span><span class="token1">></span><span class="token4">built</span><span class="token3">(</span>$data<span class="token3">)</span><span class="token3">;</span> $product <span class="token1">=</span> $buidler<span class="token1">-</span><span class="token1">></span><span class="token4">getResult</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">""</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$product<span class="token3">)</span><span class="token3">;</span> echo <span class="token2">""</span><span class="token3">;</span> ``` ``` ``` <pre class="calibre17">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token4">ini_set</span><span class="token3">(</span><span class="token2">'memory_limit'</span><span class="token3">,</span><span class="token2">'1256M'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//升级为256M内存</span> <span class="token">//(1) 产品角色:包含多个组成部件的复杂对象。</span> class <span class="token4">Product</span> <span class="token3">{</span> private $partA<span class="token3">;</span> private $partB<span class="token3">;</span> private $partC<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">setPartA</span><span class="token3">(</span>$partA<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>partA<span class="token1">=</span>$partA<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setPartB</span><span class="token3">(</span>$partB<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>partB<span class="token1">=</span>$partB<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setPartC</span><span class="token3">(</span>$partC<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>partC<span class="token1">=</span>$partC<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">show</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">//显示产品的特性</span> echo $this<span class="token1">-</span><span class="token1">></span>partA<span class="token3">;</span> echo $this<span class="token1">-</span><span class="token1">></span>partB<span class="token3">;</span> echo $this<span class="token1">-</span><span class="token1">></span>partC<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//(2) 抽象建造者:包含创建产品各个子部件的抽象方法。</span> abstract class <span class="token4">Builder</span> <span class="token3">{</span> <span class="token">//创建产品对象</span> protected $product<span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">buildPartA</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">buildPartB</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public abstract <span class="token5">function</span> <span class="token4">buildPartC</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>product <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Product</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//返回产品对象</span> public <span class="token5">function</span> <span class="token4">getResult</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>product<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//(3) 具体建造者:实现了抽象建造者接口。</span> class <span class="token4">ConcreteBuilder</span> extends <span class="token4">Builder</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">buildPartA</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>product<span class="token1">-</span><span class="token1">></span><span class="token4">setPartA</span><span class="token3">(</span><span class="token2">"建造 PartA"</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">buildPartB</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>product<span class="token1">-</span><span class="token1">></span><span class="token4">setPartB</span><span class="token3">(</span><span class="token2">"建造 PartB"</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">buildPartC</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>product<span class="token1">-</span><span class="token1">></span><span class="token4">setPartC</span><span class="token3">(</span><span class="token2">"建造 PartC"</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//(4) 指挥者:调用建造者中的方法完成复杂对象的创建。</span> class <span class="token4">Director</span> <span class="token3">{</span> private $builder<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$builder<span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>builder<span class="token1">=</span>$builder<span class="token3">;</span> <span class="token3">}</span> <span class="token">//产品构建与组装方法</span> public <span class="token5">function</span> <span class="token4">construct</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>builder<span class="token1">-</span><span class="token1">></span><span class="token4">buildPartA</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>builder<span class="token1">-</span><span class="token1">></span><span class="token4">buildPartB</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>builder<span class="token1">-</span><span class="token1">></span><span class="token4">buildPartC</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>builder<span class="token1">-</span><span class="token1">></span><span class="token4">getResult</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">Client</span><span class="token3">{</span> public static <span class="token5">function</span> <span class="token4">main</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $builder<span class="token1">=</span><span class="token5">new</span> <span class="token4">ConcreteBuilder</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $director<span class="token1">=</span><span class="token5">new</span> <span class="token4">Director</span><span class="token3">(</span>$builder<span class="token3">)</span><span class="token3">;</span> $product<span class="token1">=</span>$director<span class="token1">-</span><span class="token1">></span><span class="token4">construct</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $product<span class="token1">-</span><span class="token1">></span><span class="token4">show</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> Client<span class="token3">:</span><span class="token3">:</span><span class="token4">main</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> ``` ```