第七章 建造者模式



前言

在这里插入图片描述


一、传统方式解决盖房子需求

在这里插入图片描述

完整代码

抽象房子类 AbstractHouse

package tanchishell.SJMS.builder;

public abstract class AbstractHouse {

    //打地基
    public abstract void buildBasic();
    //砌墙
    public abstract void buildWalls();
    //封顶
    public abstract void roofed();

    //建房子
    public void build() {
        buildBasic();
        buildWalls();
        roofed();
    }
}

实现子类 普通房子

package tanchishell.SJMS.builder;

public class CommonHouse extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println(" 普通房子开始打地基 ");
    }

    @Override
    public void buildWalls() {
        System.out.println(" 普通房子砌墙 10 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println(" 普通房子盖普通屋顶  ");
    }
}


实现子类 高楼大厦

package tanchishell.SJMS.builder;

public class HighBuilding extends AbstractHouse {

    @Override
    public void buildBasic() {
        System.out.println("  高楼大厦打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  高楼大厦砌墙 20  cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  高楼大厦的透明屋顶  ");
    }
}

客户端盖房子

package tanchishell.SJMS.builder;

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        commonHouse.build();

        /** 输出
         *  普通房子开始打地基
         *  普通房子砌墙 10 cm
         *  普通房子盖普通屋顶
         */
    }
}

在这里插入图片描述

二、引入建造者模式

在这里插入图片描述

建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

House类 (产品角色)

package tanchishell.SJMS.builder2;

//产品->Product
public class House {
    private String baise;
    private String wall;
    private String roofed;

    public String getBaise() {
        return baise;
    }

    public void setBaise(String baise) {
        this.baise = baise;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoofed() {
        return roofed;
    }

    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }
}

抽象父类(抽象建造者) HouseBuilder

package tanchishell.SJMS.builder2;

// 抽象的建造者
public abstract class HouseBuilder {

    //组合房子,同生共死
    House house = new House();

    //打地基
    public abstract void buildBasic();
    //砌墙
    public abstract void buildWalls();
    //封顶
    public abstract void roofed();

    //建房子
    public House buildHouse() {
        return house;
    }

//    //更换房子的创建规模 该场景暂不支持
//    public House UpdateHouse(House house2){
//        house = house2;
//
//        return house;
//    }
}

子类(具体建造者)CommonHouse / HighBuilding

package tanchishell.SJMS.builder2;

public class CommonHouse extends HouseBuilder{
    @Override
    public void buildBasic() {
        System.out.println("  普通房子打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  普通房子砌墙 10 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  普通房子的普通屋顶  ");
    }
}

package tanchishell.SJMS.builder2;

public class HighBuilding extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("  高楼大厦打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  高楼大厦打砌墙 20 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  高楼大厦的透明屋顶  ");
    }
}


指挥者 HouseDirector

package tanchishell.SJMS.builder2;

public class HouseDirector {

    //组合 抽象建造者
    HouseBuilder houseBuilder = null;

    //构造器传入 houseBuilder
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //通过 setter 传入 houseBuilder
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //如何处理建造房子的流程,交给指挥者
    public House constructHouse() {
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}

客户端 Client

package tanchishell.SJMS.builder2;

public class Client {
    public static void main(String[] args) {
        HouseDirector houseDirector = new HouseDirector(new CommonHouse());
        //返回产品 普通房子
        House house = houseDirector.constructHouse();



        System.out.println("-----------------指挥者更换产品  -----------------");
        //指挥者更换产品
        houseDirector.setHouseBuilder(new HighBuilding());
        //返回产品 高楼大厦
        House house1 = houseDirector.constructHouse();


    }
}

三、JDK中的建造者模式 StringBuilder

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、建造者模式的注意事项和细节

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值