設計模式學習系列——建造者模式


 建造者模式

  建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。

  優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。

  缺點: 1、產品必須有共同點,范圍有限制。 2、如內部變化復雜,會有很多的建造類。

  與 工廠模式區別:

    1)工廠模式關注的是一個整體,無需關注產品各部分是如何創建出來的;建造者模式中,一個具體產品的產生是依賴各個部件的產生以及裝配順序,它關注的是“由零件一步一步地組裝出產品對象”。

  關於選用:如果需要詳細關注一個產品部件的生產、安裝步驟,則選擇建造者,否則選擇工廠方法模式。

  角色:

  •  抽象建造者
  • 具體建造者
  • 指揮者
  • 產品
  • 產品消費者

  具體實例:還是用之前去寵物市場的例子吧(以便和工廠模式做個對比)。養寵物需要有寵物和食物。會是和抽象工廠模式一個完全不同的代碼結構。參考代碼(php版):

<?php
/*
 * 建造者方法模式示例
 */
error_reporting(E_ALL);
ini_set('display_errors','on');

    /*
     * 具體產品(一個包含寵物和寵物食物的產品)
     */
    class PetGroup{
        private $petType;
        private $food;
        private $foodNum = 0;
        
        public function addPet($petType){
            $this->petType = $petType;
        }
        public function addFood($food,$foodNum){
            $this->food = $food;
            $this->foodNum = $foodNum;
        }
        public function addFish($foodNum){//加魚
            $this->food = "fish";
            $this->foodNum = $foodNum;
        }   
        public function addBone($foodNum){//加骨頭
            $this->food = "bone";
            $this->foodNum = $foodNum;
        }
        public function getPetType(){
            return $this->petType;
        }
        public function getFood(){
            return $this->food;
        }        
    }
    
    /*
     * 抽象建造者
     */
    abstract class Builder{
        //實際的產品,這里的petGroup定義為一個包含寵物和寵物食物的產品
        private $petGroup;  
        //建造寵物
        abstract public function buildPet();
        //建造食物
        abstract public function buildFood($num);
        
        public function createPetGroup(){
            $this->petGroup = new PetGroup();
        }
        public  function getPetGroup(){
            return $this->petGroup;
        }
    }
    
    /*
     * 具體建造者(貓寵物組合)
     */
    class CatGroupBuilder extends Builder{
        
        public  function buildPet(){
            $this->getPetGroup()->addPet("cat");
        }
        public function buildFood($num){
            $this->getPetGroup()->addFish($num);
        }        
    } 
    
    /*
     * 具體建造者(狗寵物組合)
     */
    class DogGroupBuilder extends Builder{
        
        public  function buildPet(){
            $this->getPetGroup()->addPet("dog");
        }
        public  function buildFood($num){
            $this->getPetGroup()->addBone($num);
        }        
    }
    
    /*
     * 指揮者
     */
     class Director{
         private $builder;
         public function __construct($builder) {
             $this->builder = $builder;
         }
         public function getBuilder(){
             return $this->builder;
         }
         public function setBuilder($builder){
             $this->builder = $builder;
         }         
         public function getPetGroup(){
             $this->builder->createPetGroup();
             $this->builder->buildPet();
             $this->builder->buildFood(5);
             return $this->builder->getPetGroup();
         }
     }

     $catGroupBuilder = new CatGroupBuilder();
     $director = new Director($catGroupBuilder);
     $catGroup = $director->getPetGroup();
     echo $catGroup->getPetType()." ".$catGroup->getFood()."<br/>";//cat fish
     $dogGroupBuilder = new DogGroupBuilder();
     $director->setBuilder($dogGroupBuilder);
     $dogGroup = $director->getPetGroup();
     echo $dogGroup->getPetType()." ".$dogGroup->getFood()."<br/>";//dog bone

?>
View Code

  對比工廠模式中的抽象工廠會看到,從消費者的角度:抽象工廠模式先讓你選擇 一個產品加工廠,加工廠可以建造一套產品的各個產品族(寵物和食物);而建造者模式,會首先有一個指揮者,把你想要生產的一套產品告訴指揮者,指揮者去組裝這套產品,交給消費者。(建造者模式更注重組裝的這個過程)

  

參考資料:

【設計模式】 模式PK:工廠模式VS建造者模式

【設計模式】建造者模式(生成器模式)

建造者模式


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com