【Java中23种面试常考的设计模式之建造者模式(Builder)---创建型模式】

【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】

知识回顾:

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】
【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】
【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】
【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】
【Java中23种面试常考的设计模式之装饰器模式(Decorator)—结构型模式】
【Java中23种面试常考的设计模式之外观模式(Facade)—结构型模式】
【Java中23种面试常考的设计模式之享元模式(Flyweight)—结构型模式】
【Java中23种面试常考的设计模式之代理模式(Proxy)—结构型模式】
【Java中23种面试常考的设计模式之单例模式(Singleton)—创建型模式】
【Java中23种面试常考的设计模式之原型模式(prototype)—创建型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】。

建造者模式

  1. 使用多个简单的对象一步一步构建成一个复杂的对象。
  2. 实际开发中,我们所需要的对象构建时非常复杂,且有很多步骤需要处理时,这时建造者模式就很适合。
  3. 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
  4. 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用

解决的问题

  1. 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

生产开发中常用的使用场景

  1. StringBuilder类的append方法
  2. SQL中的PreparedStatement

模式优点与缺点

优点
  1. 建造者独立,易扩展。
缺点
  1. 内部变化复杂,会有很多的建造类。

核心角色

指挥者Director:定义产品组装接口及组装的实现
抽象建造者Builder:定义我们的组件构造者
产品Product:最终的产品类
具体建造者ConcreteBuilder:定义我们的实现组件构造者
测试客户端类

UML类图

在这里插入图片描述

实现代码

最终产品类(以及三个组件内部类)
package com.builder;

/*
 * 最终的产品类
 */
public class Product {

    private PartA partA;

    private PartB partB;

    private PartC partC;

    public Product() {

    }

    public Product(PartA partA, PartB partB, PartC partC) {
        this.partA = partA;
        this.partB = partB;
        this.partC = partC;
    }

    public PartA getPartA() {
        return partA;
    }

    public void setPartA(PartA partA) {
        this.partA = partA;
    }

    public PartB getPartB() {
        return partB;
    }

    public void setPartB(PartB partB) {
        this.partB = partB;
    }

    public PartC getPartC() {
        return partC;
    }

    public void setPartC(PartC partC) {
        this.partC = partC;
    }

    public void show() {
        System.out.println("成功建造对象以及内部组件:");
        System.out.println(partA.toString() + "---" + partA.getName());
        System.out.println(partB.toString() + "---" + partB.getName());
        System.out.println(partC.toString() + "---" + partC.getName());
    }
}

// Product产品类中的A对象
class PartA {

    private String name;

    public PartA() {

    }

    public PartA(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartA [name=" + name + "]";
    }

}

// Product产品类中的B对象
class PartB {

    private String name;

    public PartB() {

    }

    public PartB(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartB [name=" + name + "]";
    }

}

// Product产品类中的C对象
class PartC {

    private String name;

    public PartC() {

    }

    public PartC(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "PartC [name=" + name + "]";
    }

}

指挥者
package com.builder;

public class Director {

    private Builder builder;

    public Director() {
    };

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Product construct() {
        return builder.getResult();
    }
}

建造者
package com.builder;

public abstract class Builder {

    protected Product product;

    public Builder() {
    };

    public Builder(Product product) {
        this.product = product;
    }

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract void buildPartC();

    public abstract Product getResult();

}
具体建造者
package com.builder;

public class ConcreteBuilder extends Builder {

    public ConcreteBuilder(Product product) {

        this.product = product;

    }

    @Override
    public void buildPartA() {

        // Auto-generated method stub
        product.setPartA(new PartA("产品中的A部件"));
    }

    @Override
    public void buildPartB() {

        // Auto-generated method stub
        product.setPartB(new PartB("产品中的B部件"));
    }

    @Override
    public void buildPartC() {

        // Auto-generated method stub
        product.setPartC(new PartC("产品中的C部件"));
    }

    @Override
    public Product getResult() {
        buildPartA();
        buildPartB();
        buildPartC();
        // Auto-generated method stub
        return product;
    }

}

Main函数测试类
package com.builder;

public class Main {

    public static void main(String[] args) {
        System.out.println(".........产品开始建造........");
        Product product = new Product();

        Builder builder = new ConcreteBuilder(product);

        Director director = new Director(builder);

        Product resProduct = director.construct();
        System.out.println(".........产品建造结束........");
        resProduct.show();
    }

}

运行结果:

在这里插入图片描述

好了,到这里【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】,23种设计模式持续更新汇总中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值