JAVA设计模式:建造者模式

建造者模式

一、定义

Builder模式也叫做建造者模式或是生成器模式,Builder模式是一种对象创建型模式之一,用来隐藏符合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象
在这里插入图片描述

二、代码实例
2.1 House
public class House {
    //地板
    private String floor;
    //墙
    private String wall;
    //屋顶
    private String roof;

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }

    public String getWall() {
        return wall;
    }

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

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }
}
2.2 HouseBuilder
public interface HouseBuilder {
    //修地板
    public void makeFloor();
    //修墙壁
    public void makeWall();
    //修屋顶
    public void makeRoof();
    //返回房子
    public House returnHouse();
}
2.3 PingFangBuilder(创建平房的工程队)
public class PingFangBuilder implements HouseBuilder {
    House house = new House();

    @Override
    public void makeFloor() {
        house.setFloor("平房的地板");
    }

    @Override
    public void makeWall() {
        house.setWall("平房的墙");
    }

    @Override
    public void makeRoof() {
        house.setRoof("平房的屋顶");
    }

    @Override
    public House returnHouse() {
        return house;
    }
}
2.4 GongyuBuilder(创建公寓的工程队)
public class GongyuBuilder implements HouseBuilder{
    House house  = new House();

    @Override
    public void makeFloor() {
        house.setFloor("公寓的地板");
    }

    @Override
    public void makeWall() {
        house.setWall("公寓的墙壁");
    }

    @Override
    public void makeRoof() {
        house.setRoof("公寓的屋顶");
    }

    @Override
    public House returnHouse() {
        return house;
    }
}
2.5 HouseDicretor(设计者,接受工程队)
public class HouseDicretor {
    private HouseBuilder houseBuilder;

    public HouseDicretor(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }

    public void makeHouse(){
        houseBuilder.makeWall();
        houseBuilder.makeRoof();
        houseBuilder.makeFloor();
    }
}

/*
更加规范
public class HouseDicretor {
    public HouseDicretor(HouseBuilder houseBuilder){
        houseBuilder.makeWall();
        houseBuilder.makeRoof();
        houseBuilder.makeFloor();
    }
}
*/
2.6 MainClass
public class MainClass {
    public static void main(String[] args){
        //客户端直接造房子
        House house = new House();
        house.setFloor("地板");
        house.setWall("墙壁");
        house.setRoof("屋顶");

        //由工程队来修
        HouseBuilder builder = new PingFangBuilder();
        //客服端需要调用工程队来修
        builder.makeFloor();
        builder.makeRoof();
        builder.makeWall();
        //创造完完后返回
        House house1 = builder.returnHouse();
        System.out.println(house1.getFloor());
        System.out.println(house1.getRoof());
        System.out.println(house1.getWall());

        //改进版本,交给设计者设计house
        //创建平房
        HouseBuilder builder1 = new PingFangBuilder();
        //设计者管理工程队
        HouseDicretor houseDicretor = new HouseDicretor(builder1);
        //make创建房子,设计者使用工程队开始创造房子,客户端不需自己调用
        houseDicretor.makeHouse();
        //创造完毕
        House house2 = builder1.returnHouse();
        System.out.println(house2.getFloor());
        System.out.println(house2.getRoof());
        System.out.println(house2.getWall());

        //创建公寓,需要修改工程队
        HouseBuilder builder2 = new GongyuBuilder();
        houseDicretor = new HouseDicretor(builder2);
        //make创建房子,工程队开始创造房子
        houseDicretor.makeHouse();
        //创造完毕
        House house3 = builder2.returnHouse();
        System.out.println(house3.getFloor());
        System.out.println(house3.getRoof());
        System.out.println(house3.getWall());
    }
}
三、建造者模式应用场景
  • 对象的创建:Builder模式是为对象的创建而设计的模式
  • 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象,例如代码中String的floor、wall、roof
  • 关注对象创建的各部分的创建过程:不同的工厂(这里指的是Builder生成器)队产品属性有不同的创建发方法,例如代码中的GongyuBuilder、PingfangBuilder
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值