面试必问设计模式之建造者模式

260 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

设计模式系列文章目录

如果本文对你们的开发之路有所帮助,请帮忙点个赞,您的支持是我坚持写博客的动力

前言

本系列课程将带着大家以面试题的方式 深入设计模式。这么快到了设计模式的第六篇啦,上一篇文章带着大家输入学习了设计模式的策略模式,这篇文章带着大家深入建造者模式

项目代码见 gitee.com/janyxe/desi…

建造者模式定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 同的表示

建造者模式是什么/建造者模式概念

建造者模式:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,即将复杂的对象分解为简单对象,然后一步步构建而成。

能画出建造者模式类图吗?并简单说明下

  • Director: 导演类,负责已有模块顺序,并安排抽象建造者进行建造
  • Builder: 抽象建造者,规范产品的组件,一般由子类实现
  • ConcreteBuilder: 具体建造者,实现Builder(抽象建造者)定义的全部方法,并返回一个组装好的对象
  • Product: 产品类,一般实现了模板方法模式

说说建造者模式优点

优点

  • 1、封装性高:客户端不需要关心具体细节实现
  • 2、易扩展:通过实现抽象建造者的方法可以扩展不同的业务需求

建造者模式代码实现

com.jany.builder.Director 导演类:负责已有模块顺序,并安排抽象建造者进行建造

/**
 * 导演类:负责已有模块顺序,并安排抽象建造者进行建造
 */
public class Director {
​
    private ProductBuilder productBuilder;
​
    public Director(ProductBuilder productBuilder) {
        this.productBuilder = productBuilder;
    }
​
    /**
     * 构建商品
     * @param part
     * @return
     */
    public Product buildProduct(String part){
        productBuilder.buildPart(part);
        return productBuilder.build();
    }
}

com.jany.builder.ProductBuilder

抽象建造者,规范产品的组件,一般由子类实现

定义抽象方法

/**
 * 抽象建造者,规范产品的组件,一般由子类实现
 */
public interface ProductBuilder {
    /**
     * 生产产品
     */
    Product build();
​
    /**
     * 生产步骤
     * @param part
     */
    void buildPart(String part);
}

com.jany.builder.ConcreteProductBuilder 具体建造者,实现Builder(抽象建造者)定义的全部方法,并返回一个组装好的对象

/**
 * 具体建造者,实现Builder(抽象建造者)定义的全部方法,并返回一个组装好的对象
 */
public class ConcreteProductBuilder implements ProductBuilder{
​
    /**
     * 生产过程
     */
    private String part;
​
    public void buildPart(String part) {
        this.part = part;
    }
​
    public Product build() {
        return new Product(part);
    }
​
​
}

com.jany.builder.Product 产品类,一般实现了模板方法模式

/**
 * 产品类,一般实现了模板方法模式
 */
public class Product {
​
    private String part;
​
    public Product(String part) {
        this.part = part;
    }
​
    @Override
    public String toString() {
        return "Product{" +
                "part='" + part + ''' +
                '}';
    }
}

com.jany.builder.BuilderApp 运行代码

public class BuilderApp {
​
    public static void main(String[] args) {
        ProductBuilder concreteProductBuilder = new ConcreteProductBuilder();
        Director director = new Director(concreteProductBuilder);
        Product product = director.buildProduct("生产步骤..");
        System.out.println(product);
    }
}

控制台输出

Product{part='生产步骤..'}