设计模式-建造者模式

盖房项目需求:

  • 需要建房子:这一过程为打桩、砌墙、封顶
  • 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的

1.传统方法

1.1 类图

在这里插入图片描述

1.2 代码实现
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();
    }
}
1.3 优缺点
  • 优点:
    • 好理解,简单易操作
  • 缺点:
    • 程序的扩展和维护不好
    • 耦合性强,因为把产品(即房子)和创建产品的过程(即建房子流程)封装在一起

2.建造者模式

2.1 基本介绍
  • 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,抽象过程的不同实现方法可以构造出不同表现的对象

  • 四个角色:

    • Product(产品角色):一个具体的产品对象
    • Builder(抽象建造者): 创建一个Product对象的各个部件指定的接口/抽象类
    • ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
    • Director(指挥者):构建一个使用Builder接口的对象,主要是用于创建一个复杂的对象
2.2 类图

在这里插入图片描述

2.3 代码实现
// 产品->Product
public class House {
    private String baise;
    private String wall;
    private String roofed;
	...set和get方法...
}
// 抽象建造者
public abstract class HouseBuilder {
    protected House house = new House();

    // 将建造的流程写好, 抽象的方法
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();

    //建造房子好,将产品(房子)返回
    public House buildHouse() {
        return house;
    }
}
// 具体建造者
public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基5米");
    }

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

    @Override
    public void roofed() {
        System.out.println("普通房子屋顶");
    }
}
// HighBuilding代码类似
// 指挥者,去指定制作流程,返回产品
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();
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        // 盖普通房子
        CommonHouse commonHouse = new CommonHouse();
        // 准备创建房子的指挥者
        HouseDirector houseDirector = new HouseDirector(commonHouse);

        // 完成盖房子,返回产品(普通房子)
        House house = houseDirector.constructHouse();


        // 盖高楼
        HighBuilding highBuilding = new HighBuilding();
        // 重置建造者
        houseDirector.setHouseBuilder(highBuilding);
        // 完成盖房子,返回产品(高楼)
        houseDirector.constructHouse();
    }
}

3.注意事项和细节

  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象

  • 用户使用不同的具体建造者即可得到不同的产品对象

  • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则


参考

https://www.bilibili.com/video/BV1G4411c7N4?p=55-59

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值