【设计模式】建造者模式

1.定义

建造者模式(Builder)用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

2.结构

2.1 UML类图

建造者模式

2.2 角色
  • 产品(Product)角色:包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
  • 建造者(Builder)角色:定义生成实例所需要的所有方法;
  • 具体的建造者(ConcreteBuilder)角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
  • 指挥者(Director)角色:定义使用建造者角色中的方法来生成实例的方法;

3.实现

/**
 * Product角色
 */
class House {
    private String floor;
    private String wall;
    private String roof;

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

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

    public void setRoof(String roof) {
        this.roof = roof;
    }

    @Override
    public String toString() {
        return "House {" +
                "floor='" + floor + '\'' +
                ", wall='" + wall + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    }
}

interface Builder {
    void buildFloor();
    void buildWall();
    void buildRoof();
}

class ApartmentBuilder implements Builder{
    private House house;

    public ApartmentBuilder(House house) {
        this.house = house;
    }

    @Override
    public void buildFloor() {
        house.setFloor("公寓的地面已建");
    }

    @Override
    public void buildWall() {
        house.setWall("公寓的墙已建");
    }

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

class HouseDirector {
    private Builder house;

    public HouseDirector(Builder house) {
        this.house = house;
    }

    /**
     * 盖房子
     */
    public void buildeHouse() {
        house.buildFloor();
        house.buildWall();
        house.buildRoof();
    }
}

public class BuilderDemo {
    public static void main(String[] args) {
        House house = new House();
        System.out.println("建造前:" + house);
        ApartmentBuilder apartmentBuilder = new ApartmentBuilder(house);
        HouseDirector director = new HouseDirector(apartmentBuilder);
        director.buildeHouse();
        System.out.println("建造后:" + house);
    }
}

4.优缺点

4.1 优点
  • 易扩展,增加新的具体建造者无需修改原有类库的代码,符合“开闭原则“。
  • 产品的建造和表示分离,易于解耦,可以使用相同的创建过程来得到不同的产品。
4.2 缺点
  • 建造者模式所创建的产品需要具有共同点,如果产品之间的差异性很大,则不适合使用建造者模式,使用范围有限制。
  • 若产品的内部变化复杂,就需要更多的建造者类,难以维护。

本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值