需求:

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

一、传统方式

  1. public abstract class AbstractHouse {
  2. //打地基
  3. public abstract void buildBasic();
  4. //砌墙
  5. public abstract void buildWalls();
  6. //封顶
  7. public abstract void roofed();
  8. // 盖房子过程
  9. public void build() {
  10. buildBasic();
  11. buildWalls();
  12. roofed();
  13. }
  14. }
  1. public class CommonHouse extends AbstractHouse {
  2. @Override
  3. public void buildBasic() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 普通房子打地基 ");
  6. }
  7. @Override
  8. public void buildWalls() {
  9. // TODO Auto-generated method stub
  10. System.out.println(" 普通房子砌墙 ");
  11. }
  12. @Override
  13. public void roofed() {
  14. // TODO Auto-generated method stub
  15. System.out.println(" 普通房子封顶 ");
  16. }
  17. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. CommonHouse commonHouse = new CommonHouse();
  5. commonHouse.build();
  6. }
  7. }

image.png

二、建造者模式

1、基本介绍

image.png
image.png

2、实现

  1. //产品->Product
  2. @Data
  3. public class House {
  4. private String baise;
  5. private String wall;
  6. private String roofed;
  7. }
  1. // 抽象的建造者
  2. public abstract class HouseBuilder {
  3. protected House house = new House();
  4. //将建造的流程写好, 抽象的方法
  5. public abstract void buildBasic();
  6. public abstract void buildWalls();
  7. public abstract void roofed();
  8. //建造房子好, 将产品(房子) 返回
  9. public House buildHouse() {
  10. return house;
  11. }
  12. }
  1. // 具体的建造者
  2. public class CommonHouse extends HouseBuilder {
  3. @Override
  4. public void buildBasic() {
  5. // TODO Auto-generated method stub
  6. System.out.println(" 普通房子打地基5米 ");
  7. }
  8. @Override
  9. public void buildWalls() {
  10. // TODO Auto-generated method stub
  11. System.out.println(" 普通房子砌墙10cm ");
  12. }
  13. @Override
  14. public void roofed() {
  15. // TODO Auto-generated method stub
  16. System.out.println(" 普通房子屋顶 ");
  17. }
  18. }
  1. // 具体的建造者
  2. public class HighBuilding extends HouseBuilder {
  3. @Override
  4. public void buildBasic() {
  5. // TODO Auto-generated method stub
  6. System.out.println(" 高楼的打地基100米 ");
  7. }
  8. @Override
  9. public void buildWalls() {
  10. // TODO Auto-generated method stub
  11. System.out.println(" 高楼的砌墙20cm ");
  12. }
  13. @Override
  14. public void roofed() {
  15. // TODO Auto-generated method stub
  16. System.out.println(" 高楼的透明屋顶 ");
  17. }
  18. }
  1. //指挥者,这里去指定制作流程,返回产品
  2. public class HouseDirector {
  3. HouseBuilder houseBuilder = null;
  4. //构造器传入 houseBuilder
  5. public HouseDirector(HouseBuilder houseBuilder) {
  6. this.houseBuilder = houseBuilder;
  7. }
  8. //通过setter 传入 houseBuilder
  9. public void setHouseBuilder(HouseBuilder houseBuilder) {
  10. this.houseBuilder = houseBuilder;
  11. }
  12. //如何处理建造房子的流程,交给指挥者
  13. public House constructHouse() {
  14. houseBuilder.buildBasic();
  15. houseBuilder.buildWalls();
  16. houseBuilder.roofed();
  17. return houseBuilder.buildHouse();
  18. }
  19. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. //盖普通房子
  4. CommonHouse commonHouse = new CommonHouse();
  5. //准备创建房子的指挥者
  6. HouseDirector houseDirector = new HouseDirector(commonHouse);
  7. //完成盖房子,返回产品(普通房子)
  8. House house = houseDirector.constructHouse();
  9. //System.out.println("输出流程");
  10. System.out.println("--------------------------");
  11. //盖高楼
  12. HighBuilding highBuilding = new HighBuilding();
  13. //重置建造者
  14. houseDirector.setHouseBuilder(highBuilding);
  15. //完成盖房子,返回产品(高楼)
  16. houseDirector.constructHouse();
  17. }
  18. }

适用场景

  • 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
  • 多个部件都可以装配到一个对象中,但产生的运行结果不相同
  • 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
  • 初始化一个对象时,参数过多,或者很多参数具有默认值
  • Builder模式不适合创建差异性很大的产品类
    产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

    主要作用:

    在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

  • 用户只需要给出指定复杂对象的类型和内容;

  • 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

image.png

模式讲解:

  • 指挥者(Director)直接和客户(Client)进行需求沟通;
  • 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
  • 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
  • 各个具体建造者负责进行产品部件的构建;
  • 最终构建成具体产品(Product)。

    建造者模式与抽象工厂模式的比较:

  • 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。

  • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
  • 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车