<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示 創建者模式中,客戶端不再負責對象的創建與組裝,而是把這個對象創建的責任交給其具體的創建者類,把組裝的責任交給組裝類,客戶端支只負責對象的調用,從而明確了各個類的職責 例如,計算機是由 OPU、主板、內存、硬盤、顯卡、機箱、顯示器、鍵盤、鼠標等部件組裝而成的,采購員不可能自己去組裝計算機,而是將計算機的配置要求告訴計算機銷售公司,計算機銷售公司安排技術人員去組裝計算機,然后再交給要買計算機的采購員 如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發型等特性都有所差異 還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;每封電子郵件的發件人、收件人、主題、內容、附件等內容也各不相同 **他們的關系是聚合關系**:------◇ 聚合是整體和個體之間的關系 **主要優點如下:** 1. 各個具體的建造者相互獨立,有利于系統的擴展。 2. 客戶端不必知道產品內部組成的細節,便于控制細節風險。 **其缺點如下:** 1. 產品的組成部分必須相同,這限制了其使用范圍。 2. 如果產品的內部變化復雜,該模式會增加很多的建造者類,后期維護成本較大。 **以下情況應當使用建造者模式:** 1、?需要生成的產品對象有復雜的內部結構。 2、?需要生成的產品對象的屬性相互依賴,建造者模式可以強迫生成順序。 3、?在對象創建過程中會使用到系統中的一些其它對象,這些對象在產品對象的創建過程中不易得到。 **建造者模式的效果:** 1、?建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產品內部組成的細節。 2、?每一個Builder都相對獨立,而與其它的Builder(獨立控制邏輯)無關。 3、?模式所建造的最終產品更易于控制。 **具體場景舉例:** 在很多游戲軟件中,地圖包括天空、地面、背景等組成部分,人物角色包括人體、服裝、裝備等組成部分,可以使用建造者模式對其進行設計, 通過不同的具體建造者創建不同類型的地圖或人物 >[danger] 建造者(Builder)模式和工廠模式的關注點不同:建造者模式注重零部件的組裝過程,而[工廠方法模式](http://c.biancheng.net/view/1348.html)更注重零部件的創建過程,但兩者可以結合使用 ![](https://img.kancloud.cn/46/4b/464b1c7f6b750f40732fbcf413c26e00_611x641.png) ~~~ class person { public $age; public $speed; public $knowledge; } //抽象建造者類 abstract class Builder{ public $_person; public abstract function setAge(); public abstract function setSpeed(); public abstract function setKnowledge(); public function __construct(Person $person){ $this->_person=$person; } public function getPerson(){ return $this->_person; } } //長者建造者 class OlderBuider extends Builder{ public function setAge(){ $this->_person->age=70; } public function setSpeed(){ $this->_person->speed="low"; } public function setKnowledge(){ $this->_person->knowledge='more'; } } //小孩建造者 class ChildBuider extends Builder{ public function setAge(){ $this->_person->age=10; } public function setSpeed(){ $this->_person->speed="fast"; } public function setKnowledge(){ $this->_person->knowledge='litte'; } } //建造指揮者 class Director{ private $_builder; public function __construct(Builder $builder){ $this->_builder = $builder; } public function built(){ $this->_builder->setAge(); $this->_builder->setSpeed(); $this->_builder->setKnowledge(); } } //實例化一個長者建造者 $oldB = new OlderBuider(new Person); //實例化一個建造指揮者 $director = new Director($oldB); //指揮建造 $director->built(); //得到長者 $older = $oldB->getPerson(); var_dump($older); ~~~ 購物車: ~~~ //購物車 (product) class ShoppingCart { # 選中的商品 private $_goods = array(); # 使用的優惠券 private $_tickets = array(); # 商品賦值 public function addGoods($goods) { $this->_goods[] = $goods; } # 優惠券賦值 public function addTicket($ticket) { $this->_tickets[] = $ticket; } public function printInfo() { # builder:goods:(衣服,鞋子), tickets:(減10) printf("goods:(%s), tickets:(%s)", implode(',', $this->_goods), implode(',', $this->_tickets)); } } //假如我們要還原購物車的東西,比如用戶關閉瀏覽器后再打開時會根據cookie還原 $data = array( 'goods' => array('衣服', '鞋子'), 'tickets' => array('減10'), ); # 如果不使用創建者模式,則需要業務類里一步步還原購物車 /* $cart = new ShoppingCart(); foreach ($data['goods'] as $goods) { $cart->addGoods($goods); } foreach ($data['tickets'] as $ticket) { $cart->addTicket($ticket); } $cart->printInfo(); exit; */ //我們提供創建者類來封裝購物車的數據組裝 (比工廠模式多了一個“導演類”的角色 ) class CardBuilder { private $_card; function __construct($card) { $this->_card = $card; } function build($data) { foreach ($data['goods'] as $goods) { $this->_card->addGoods($goods); } foreach ($data['tickets'] as $ticket) { $this->_card->addTicket($ticket); } } function getCrad() { return $this->_card; } } $cart = new ShoppingCart(); $builder = new CardBuilder($cart); $builder->build($data); echo "after builder:"; $cart->printInfo(); ###### 進階 /** * * 產品本身 */ class ShoppingCart { public $_goods; public $_tickets; } /** * 建造者抽象類 * */ abstract class Builder { public abstract function buildGoods($goods); public abstract function buildTicket($tickets); public abstract function getResult(); } /** * * 具體建造者 * 實現其具體方法 */ class CartBuilder extends Builder { private $_product; public function __construct(ShoppingCart $product) { $this->_product = new ShoppingCart(); } public function buildGoods($goods) { $this->_product->_goods=$goods; } public function buildTicket($tickets) { $this->_product->_tickets=$tickets; } public function getResult() { return $this->_product; } } /** * * 并不知道具體實現細節 只需要指揮具體建造者建造 */ class Director { private $_builder; public function __construct(Builder $builder) { $this->_builder = $builder; } public function built($data){ $this->_builder->buildGoods($data['goods']); $this->_builder->buildTicket($data['tickets']); } } $data = array( 'goods' => array('衣服', '鞋子'), 'tickets' => array('減10'), ); // client $buidler = new CartBuilder(new ShoppingCart); $director = new Director($buidler); $director->built($data); $product = $buidler->getResult(); echo "<pre>"; var_dump($product); echo "</pre>"; ~~~ ``` <?php ini_set('memory_limit','1256M'); //升級為256M內存 //(1) 產品角色:包含多個組成部件的復雜對象。 class Product { private $partA; private $partB; private $partC; public function setPartA($partA) { $this->partA=$partA; } public function setPartB($partB) { $this->partB=$partB; } public function setPartC($partC) { $this->partC=$partC; } public function show() { //顯示產品的特性 echo $this->partA; echo $this->partB; echo $this->partC; } } //(2) 抽象建造者:包含創建產品各個子部件的抽象方法。 abstract class Builder { //創建產品對象 protected $product; public abstract function buildPartA(); public abstract function buildPartB(); public abstract function buildPartC(); public function __construct(){ $this->product = new Product(); } //返回產品對象 public function getResult() { return $this->product; } } //(3) 具體建造者:實現了抽象建造者接口。 class ConcreteBuilder extends Builder { public function buildPartA() { $this->product->setPartA("建造 PartA"); } public function buildPartB() { $this->product->setPartB("建造 PartB"); } public function buildPartC() { $this->product->setPartC("建造 PartC"); } } //(4) 指揮者:調用建造者中的方法完成復雜對象的創建。 class Director { private $builder; public function __construct($builder){ $this->builder=$builder; } //產品構建與組裝方法 public function construct() { $this->builder->buildPartA(); $this->builder->buildPartB(); $this->builder->buildPartC(); return $this->builder->getResult(); } } class Client{ public static function main(){ $builder=new ConcreteBuilder(); $director=new Director($builder); $product=$director->construct(); $product->show(); } } Client::main(); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看