設計模式----Builder(產生器)模式

來源:互聯網
上載者:User

設計模式----Builder(產生器)模式

 

GoF將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

 

Builder模式與Absrtact Factory模式非常像。GoF指出,他們二者的主要區別就在於Builder模式遵循一定的步驟一步一步建立對象。

 

Builder模式是為了將構建複雜物件的過程和他的組件相分離。因為一個複雜的對象不但有很多大量的組成部分,還有很多小的零件。他(複雜物件)本身要靠這些組件和零件來組裝。例如:一座房子,它有很多組件:房間、窗戶;還有門窗上的鎖和窗戶上的插銷等小零件。Builder模式的目的就是為了將組件(門、窗等)和組裝過程(整個房子的建造)分開。

 

現在假設一個房子有多個組件組成的,Builder模式的目的是把複雜物件的建立和組件的建立分別開來。分別用Builder類和Director類來表示。

 

下面以建造房子為例:

首先定義一個抽象類別,它定義如何建立複雜物件的各個組件

package Builder;

 

public abstract class HouseBuilder

{

    public abstract void BuildRoom(int roomNo);//構建房間

    public abstract void BuildDoor(int room1, int room2);//構建門

    //得到最後的房屋

    public abstract House getHouse();

}//end abstract class HouseBuilder

 

用Director構建複雜物件(房子):

package Builder;

 

public class HouseDirector

{

    public void createHouse(HouseBuilder concreteBuilder)

    {

        concreteBuilder.buildRoom(2);

        concreteBuilder.buildDoor(3);

    }//end createHouse(...)

   

}//end class HouseDirector

 

Builder的具體實現ConcreteHouseBuilder:通過完成Builder來構建產品(房子)的組件

package Builder;

 

public class ConcreteHouseBuilder extends HouseBuilder

{

    private House house;

   

    public ConcreteHouseBuilder()

    {

        house = new House();

    }//end ConcreteHouseBuilder()

   

    //建立屋子的數量

    public void buildRoom(int roomNumber)

    {

        house.roomNumber = roomNumber;

    }//end BuildRoom

 

    //建立門的數量

    public void buildDoor(int doorNumber)

    {

        house.doorNumber = doorNumber;

    }

 

    //返回建立好的房屋

    public House getHouse()

    {

        return house;

    }//end getHouse()

}//end class ConcreteHouseBuildera

 

具體的屋子:

package Builder;

 

public class House

{

    int roomNumber;

    int doorNumber;

   

    public House()

    {

        roomNumber = 0;

        doorNumber = 0;

    }//end House()

   

    public int getRoomNumber()

    {

        return roomNumber;

    }//end getRoomNumber()

   

    public int getDoorNumber()

    {

        return doorNumber;

    }//end getDoorNumber()

   

}//end class House

 

Builder模式的具體運用:

/*

 * BuilderPattern.java

 *

 * Created on 2006年3月28日, 下午10:01

 *

 * To change this template, choose Tools | Template Manager

 * and open the template in the editor.

 */

 

package Builder;

 

/**

 *

 * @author Administrator

 */

public class BuilderPattern

{

    House house;

    ConcreteHouseBuilder houseBuilder;

    HouseDirector houseDirecor;

    public BuilderPattern()

    {

        house = new House();

        houseBuilder = new ConcreteHouseBuilder();

        houseDirecor = new HouseDirector();

    }

   

    public void createHouse()

    {

        houseDirecor.createHouse(houseBuilder);

        house = houseBuilder.getHouse();

        System.out.println("My house has room :" + house.getRoomNumber());

        System.out.println("My house has door :" + house.getDoorNumber());

    }//end creatHouse()

   

    public static void main(String[] args)

    {

        System.out.println("The Builder Pattern!");

        BuilderPattern bp = new BuilderPattern();

        bp.createHouse();

    }

}//end class BuilderPattern

 

最後的結果:

My house has room :2

My house has door :3

最後給出UML圖:

 

小結:

當一個對象由複雜的組件構成時,我們可以試著去用Builder模式來實現。Builder模式將對象的組裝過程和對象的組件分離。其實這也非常好理解。比如說汽車,汽車的生產和汽車發動機的生產是分開的。

 

   

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=967906  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.