设计模式----Builder(生成器)模式

来源:互联网 发布:vwap算法 编辑:程序博客网 时间:2024/05/01 17:06

设计模式----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 2006328, 下午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