设计模式之建造者模式

案例

盖房项目需求

  • 需要建房子:这一过程为打桩、砌墙、封顶等
  • 房子有很多种类:例如普通房、高楼、别墅等,虽然建房子的过程一样,但是要求不一定相同
  • 请编写程序完成需求

传统方式解决盖房需求

image

public abstract class AbstractHouse {
    /**
     * 打地基
     */
    public abstract void buildBasic();

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

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

    public void build(){
        buildBasic();
        buildWalls();
        roofed();
    }
}

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

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

    @Override
    public void roofed() {
        System.out.println("普通房子封顶");
    }
}
public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        commonHouse.build();
    }
}

优缺点

  • 优点是比较好理解,简单易操作
  • 设计的程序结构过于简单,没有设计缓存层对象,程序的扩展性和维护性不好,也就是说,这种设计方案,吧产品和创建产品的过程封装在一起,耦合性增强了
    解决方案:将产品和产品建造过程解耦 => 建造者模式

建造者模式

基本介绍

  • 建造者模式又叫生成器模式,是一种对象构建模式。他可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同的表现(属性)的对象
  • 建造者模式是一步一步构建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部的具体构建细节
建造者模式的四个角色
  • (Product)产品角色:一个具体的产品对象
  • (Build)抽象建造者:创建一个Product对象的各个部件指定的接口
  • (ConcreteBuilder)具体建造者:实现接,构建和装配各个部件
  • (Director)指挥者:构建一个使用Builder接口的对象。它主要是用于创建一个复杂对象。它主要有两个作用,一个是隔离了客户与对象的生产过程,另一个是负责控制产品对象的生产过程
    image

改进方案

image

@Data
@AllArgsConstructor
@NoArgsConstructor
public class House {
    private String basic;
    private String wall;
    private String roofed;
}
public abstract class HouseBuilder {
    protected House house = new House();

    /**
     * 建造地基
     */
    abstract void buildBasic();

    /**
     * 建造墙体
     */
    abstract void buildWalls();

    /**
     * 建造屋顶
     */
    abstract void roofed();

    public House build(){
        return house;
    }
}
public class HighHouseBuilder extends HouseBuilder {
    @Override
    void buildBasic() {
        System.out.println("建造高楼房子地基");
        house.setBasic("高楼房子地基");
    }

    @Override
    void buildWalls() {
        System.out.println("建造高楼房子墙体");
        house.setWall("高楼房子墙体");
    }

    @Override
    void roofed() {
        System.out.println("建造高楼房子屋顶");
        house.setRoofed("高楼房子屋顶");
    }
}

public class CommonHouseBuilder extends HouseBuilder {
    @Override
    void buildBasic() {
        System.out.println("建造普通房子地基");
        house.setBasic("普通房子地基");
    }

    @Override
    void buildWalls() {
        System.out.println("建造普通房子墙体");
        house.setWall("普通房子墙体");
    }

    @Override
    void roofed() {
        System.out.println("建造普通房子屋顶");
        house.setRoofed("普通房子屋顶");
    }
}
public class HouseDirector {
    HouseBuilder houseBuilder = null;

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

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //建造房子的流程由指挥者来安排
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.build();
    }
}
public class Client {
    public static void main(String[] args) {
        CommonHouseBuilder commonHouseBuilder = new CommonHouseBuilder();
        HouseDirector houseDirector = new HouseDirector(commonHouseBuilder);
        House house = houseDirector.constructHouse();
        System.out.println(house.toString());
        houseDirector.setHouseBuilder(new HighHouseBuilder());
        house = houseDirector.constructHouse();
        System.out.println(house.toString());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值