构造模式(Builder Pattern)

本文介绍构建模式的概念及其在软件设计中的应用。通过一个构建房屋的例子详细展示了如何使用构建模式从简单对象构建复杂对象,并提供了Java代码实现。

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

适用场合和好处:

  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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值