构造模式(Builder Pattern)

从简单的对象一步一步构造一个复杂的对象,这就叫做构建模式。它是属于创建设计模式之一,也挺常用的。

适用场合和好处:

  1. 仅仅通过指定它的类型和内容来生成一个复杂的对象,而这个构造的对象隐藏在它的构建细节。
  2. 想分离构建一个复杂对象的过程。
  3. 为析构和呈现而隔离代码
  4. 给予你更好的控制析构(construction)过程。
对于组合(Composite), 它经常用来构建一个复杂的对象,而构建模式则强调从简单的对象构建一个复杂的对象。
分析一个实例,如下:
假如有一个构建房屋的程序,有几个造房子的步骤,完成这些步骤就好。
House.java类
public class House {
    private String type = null;
    private List features = new ArrayList();

    public House() {
    }

    public House(String type) {
        this.type = type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setProgress(String s) {
        features.add(s);
    }

    public String toString() {
        StringBuffer ff = new StringBuffer();
        String t = type.substring(6);
        ff.append(t + "\n ");
        int size =  features.size();
        for (int i = 0; i < size; i++) {
             ff.append(features.get(i) + "\n ");
        }
        return ff.toString();
    }
}

它的子类Skyscraper.java
public class Skyscraper extends HouseBuilder {

    Skyscraper(String type){
        System.out.println("--Building the house "+ type);
        house.setType(this.getClass() +" :"+ type);
    }
    @Override
    public void buildFoundation() {
          //doEngineering()
        //doExcavating()
        //doPlumbingHeatingElectricity()
        //doSewerWaterHookUp()
        //doFoundationInspection()
        house.setProgress("foundation is done");
    }

    @Override
    public void buildFrame() {
        //doHeatingPlumbingRoof()
        //doElectricityRoute()
        //doDoorsWindows()
        //doFrameInspection()
        house.setProgress("frame is done");
    }

    @Override
    public void buildExterior() {
         //doOverheadDoors()
        //doBrickWorks()
        //doSidingsoffitsGutters()
        //doDrivewayGarageFloor()
        //doDeckRail()
        //doLandScaping()
        house.setProgress("Exterior is waiting to start");
    }

    @Override
    public void buildInterior() {
         //doBuiltinVacuum()
        //doInsulation()
        //doDryWall()
        //doPainting()
        //doLinoleum()
        //doCabinet()
        //doTileWork()
        //doLightFixtureBlinds()
        //doCleaning()
        //doInteriorInspection()
        house.setProgress("Interior is not started yet");
    }
}

定义一个房子构造抽象类HouseBuilder.java.
abstract class HouseBuilder {
    protected House house = new House();

    //show the building info
    protected String showProgress() {
        return house.toString();
    }

    abstract public void buildFoundation();
    abstract public void buildFrame();
    abstract public void buildExterior();
    abstract public void buildInterior();
}

构造启动类Workshop.java.
public class Workshop{
    public void construct(HouseBuilder builder){
        builder.buildFoundation();
        builder.buildFrame();
        builder.buildExterior();
        builder.buildExterior();
    }
}

测试这个构造模式,代码如下:
public class Builder {
    public static void main(String []args){
        System.out.println("---- Builder Pattern ---------");

        //initialize two house builder objects
        HouseBuilder skyscraperOne = new Skyscraper("************Telnet");
        HouseBuilder skyscraperTwo = new Skyscraper("****************DongDu");

        //build the workspace for the project
        Workshop workshop = new Workshop();
        workshop.construct(skyscraperOne);
        workshop.construct(skyscraperTwo);

        //show the building information
        System.out.println("---check the building-----");
        System.out.println(skyscraperOne.showProgress());
        System.out.println(skyscraperTwo.showProgress());
    }
}

结果如下:
---- Builder Pattern ---------
--Building the house ************Telnet
--Building the house ****************DongDu
---check the building-----
org.pattern.rationaljava.creationalpattern.Skyscraper :************Telnet
 foundation is done
 frame is done
 Exterior is waiting to start
 Exterior is waiting to start
 
org.pattern.rationaljava.creationalpattern.Skyscraper :****************DongDu
 foundation is done
 frame is done
 Exterior is waiting to start
 Exterior is waiting to start


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值