美文网首页
设计模式 - 建造者模式(5/23)

设计模式 - 建造者模式(5/23)

作者: 夹板儿孩 | 来源:发表于2023-02-08 21:26 被阅读0次

建造者模式

建造者模式有四个角色

  1. 产品:如果把产品比作为房子,那么它就是一个具体的产品对象,比如别墅、公寓
  2. 抽象建造者:盖房子的步骤、方法等。比如都需要打地基、砌墙、封顶
  3. 具体建造者:实现或者继承抽象建造者
  4. 指挥者:承建商。它负责盖别墅、公寓。分离不同建造者与不同产品的关系。由指挥者最终交付产品

从第四这个步骤看,实际与工厂方法、抽象工厂是比较像的

举例

工厂方法与建造者模式的区别

工厂方法:注重于整体建造房子。它实际相当于是房产中介。他们不生产房子,你找他要房子,他就给你

建造者模式:犹如你自己亲临参与盖房子的过程,你将会知道盖房子的每一步

抽象工厂与建造者模式的区别

抽象工厂: 抽象工厂是将不同房子归类,由中介里不同的团队负责。你不需要知道哪个团队负责什么房子,你找到中介要房子,中介自己调度团队,最终给你房子

建造者模式: 你需要自己先知道要什么房子,然后找什么样的工程队伍再盖房子

[产品] 基础的房子需要的东西

public class House {
    /**
     * 卧室数量
     */
    private int bedroomNum;
    /**
     * 客厅数量
     */
    private int livingRoomNum;
    /**
     * 餐厅数量
     */
    private int diningRoomNum;
    /**
     * 其他房间数量
     */
    private int otherRoomNum;

    public int getBedroomNum() {
        return bedroomNum;
    }

    public void setBedroomNum(int bedroomNum) {
        this.bedroomNum = bedroomNum;
    }

    public int getLivingRoomNum() {
        return livingRoomNum;
    }

    public void setLivingRoomNum(int livingRoomNum) {
        this.livingRoomNum = livingRoomNum;
    }

    public int getDiningRoomNum() {
        return diningRoomNum;
    }

    public void setDiningRoomNum(int diningRoomNum) {
        this.diningRoomNum = diningRoomNum;
    }

    public int getOtherRoomNum() {
        return otherRoomNum;
    }

    public void setOtherRoomNum(int otherRoomNum) {
        this.otherRoomNum = otherRoomNum;
    }

    @Override
    public String toString() {
        return "房子交付{" +
                "卧室: " + bedroomNum +
                ", 客厅: " + livingRoomNum +
                ", 餐厅: =" + diningRoomNum +
                ", 其他: " + otherRoomNum +
                '}';
    }
}

[抽象建造者]建造房子的基本方法

public abstract class Building {

    /**
     * 打地基
     */
    public abstract void foundation();

    /**
     * 砌墙
     */
    public abstract void brickwork();

    /**
     * 封顶
     */
    public abstract void roofed();

    /**
     * 交付
     */
    public abstract House deliver();
}

[实际建造者] 公寓的建造方法

public class ApartmentBuilder extends Building {
    @Override
    public void foundation() {
        System.out.println("公寓正在打地基");
    }

    @Override
    public void brickwork() {
        System.out.println("公寓正在砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("公寓正在封顶");
    }

    @Override
    public House deliver() {
        House house = new House();
        house.setBedroomNum(3);
        house.setDiningRoomNum(1);
        house.setLivingRoomNum(1);
        house.setOtherRoomNum(1);
        System.out.println("公寓 - " + house.toString());
        return house;
    }

    public void luxuriousDecoration() {
        System.out.println("公寓豪华装修");
    }

}

[实际建造者] 别墅的建造方法

public class VillaBuilder extends Building {
    @Override
    public void foundation() {
        System.out.println("别墅正在打地基");
    }

    @Override
    public void brickwork() {
        System.out.println("别墅正在砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("别墅正在封顶");
    }

    private void luxuriousDecoration() {
        System.out.println("别墅豪华装修");
    }


    @Override
    public House deliver() {
        this.luxuriousDecoration();

        House house = new House();
        house.setBedroomNum(6);
        house.setDiningRoomNum(2);
        house.setLivingRoomNum(2);
        house.setOtherRoomNum(10);
        System.out.println("别墅 - " + house.toString());
        return house;
    }
}

[指挥者] 承建商

public class ConstructionTeam {
    private Building build = null;

    // 实例承建商时需要告诉承建商你要什么房子
    public ConstructionTeam(Building building) {
        this.build = building;
    }

    public House building() {
        this.build.foundation();
        this.build.brickwork();
        this.build.roofed();
        return this.build.deliver();
    }
}

main

public class Main {
    public static void main(String[] args) {
        // 别墅
        House villa = new ConstructionTeam(new VillaBuilder()).building();
        // 公寓
        House apartment = new ConstructionTeam(new ApartmentBuilder()).building();
    }
}

console

别墅正在打地基
别墅正在砌墙
别墅正在封顶
别墅豪华装修
别墅 - 房子交付{卧室: 6, 客厅: 2, 餐厅: =2, 其他: 10}
公寓正在打地基
公寓正在砌墙
公寓正在封顶
公寓 - 房子交付{卧室: 3, 客厅: 1, 餐厅: =1, 其他: 1}

Process finished with exit code 0

相关文章

网友评论

      本文标题:设计模式 - 建造者模式(5/23)

      本文链接:https://www.haomeiwen.com/subject/aehaqdtx.html