JAVA设计模式5:建造者模式,将对象的构建过程与其表示分离

简介: JAVA设计模式5:建造者模式,将对象的构建过程与其表示分离

一、什么是建造者模式

建造者模式是一种创建型设计模式,它将对象的构建过程与其表示分离,以便于相同的构建过程可以创建不同的表示。

建造者模式的主要思想是将一个复杂对象的构建过程分离成多个简单的对象构建步骤,并通过一个指导者来控制这些构建步骤的顺序和方式。这样可以灵活地创建不同的对象表示,而无需改变构建过程的逻辑。

建造者模式通常由以下 4 44 个角色组成。

  • 产品(Product):需要被构建的复杂对象,包含多个部分或属性。
  • 抽象建造者(Builder):定义了构建产品的抽象方法,并且通常包含获取最终产品的方法。
  • 具体建造者(Concrete Builder):实现了抽象建造者接口,定义了具体的构建步骤和逻辑。
  • 指导者(Director):负责控制建造过程的顺序和方式,最终返回构建好的产品。

建造者模式的优点包括以下 3 33 点,请同学们认真学习。

  • 可以对构建过程进行精细控制,灵活性较高。
  • 可以将复杂对象的构建过程与其表示分离,使得代码更加可读、可维护。
  • 可以重复使用相同的构建过程来创建不同的对象表示。

建造者模式的应用场景包括以下两点。

  • 需要创建复杂对象,且对象的构建过程与其表示相对独立。
  • 需要创建不同表示的对象,但使用相同的构建过程。

建造者模式通过将复杂对象的构建过程分解为多个简单的构建步骤,使得构建过程灵活可控,同时可以创建不同的对象表示。它是一种优秀的创建型设计模式,在许多场景下都有着广泛应用。


二、建造者模式实例

当我们使用建造者模式创建一个简单的汽车对象时,可以按照如下方式实现,请同学们复制到本地执行。

// 产品类:汽车
class Car {
    private String brand;
    private String color;
    private int wheels;
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public void setWheels(int wheels) {
        this.wheels = wheels;
    }
    public void showInfo() {
        System.out.println("Car brand: " + brand);
        System.out.println("Car color: " + color);
        System.out.println("Number of wheels: " + wheels);
    }
}
// 抽象建造者类
abstract class CarBuilder {
    protected Car car;
    public Car getCar() {
        return car;
    }
    public abstract void buildBrand();
    public abstract void buildColor();
    public abstract void buildWheels();
}
// 具体建造者类:SUV汽车建造者
class SuvCarBuilder extends CarBuilder {
    public SuvCarBuilder() {
        car = new Car();
    }
    public void buildBrand() {
        car.setBrand("SUV");
    }
    public void buildColor() {
        car.setColor("Black");
    }
    public void buildWheels() {
        car.setWheels(4);
    }
}
// 具体建造者类:跑车建造者
class SportsCarBuilder extends CarBuilder {
    public SportsCarBuilder() {
        car = new Car();
    }
    public void buildBrand() {
        car.setBrand("Sports Car");
    }
    public void buildColor() {
        car.setColor("Red");
    }
    public void buildWheels() {
        car.setWheels(4);
    }
}
// 指导者类:负责控制建造过程
class CarDirector {
    private CarBuilder carBuilder;
    public void setCarBuilder(CarBuilder carBuilder) {
        this.carBuilder = carBuilder;
    }
    public Car getCar() {
        return carBuilder.getCar();
    }
    public void constructCar() {
        carBuilder.buildBrand();
        carBuilder.buildColor();
        carBuilder.buildWheels();
    }
}
// 客户端类
public class BuilderPatternExample {
    public static void main(String[] args) {
        CarDirector director = new CarDirector();
        CarBuilder suvBuilder = new SuvCarBuilder();
        director.setCarBuilder(suvBuilder);
        director.constructCar();
        Car suvCar = director.getCar();
        suvCar.showInfo();
        CarBuilder sportsCarBuilder = new SportsCarBuilder();
        director.setCarBuilder(sportsCarBuilder);
        director.constructCar();
        Car sportsCar = director.getCar();
        sportsCar.showInfo();
    }
}

在上面的代码中,我们定义了一个产品类Car,它具有品牌、颜色和轮子数量属性,以及展示信息的方法。然后,我们定义了抽象建造者类 CarBuilder,包含了构建汽车品牌、颜色和轮子数量的抽象方法。

接着,我们创建了两个具体建造者类 SuvCarBuilderSportsCarBuilder,分别实现了抽象建造者类的方法来创建不同类型的汽车。

最后,我们定义了一个指导者类 CarDirector,负责控制建造过程,并提供获取构建好的汽车对象的方法。在客户端代码中,我们使用指导者类来指定具体的建造者对象,并进行构建过程,最终得到构建好的汽车对象,并展示其信息。

这个示例展示了建造者模式的实现,根据不同的建造者,可以构建不同类型的汽车对象,而无需直接调用构造函数或设置每个属性。这种方式可以提高代码的可读性和可维护性,同时允许我们灵活地控制构建过程。


三、建造者模式的应用场景

建造者模式适用于以下 5 55 个应用场景,请同学们认真学习。

  1. 创建复杂对象:当需要创建一个复杂对象,并且该对象的构建过程涉及多个步骤和组件时,可以使用建造者模式。通过将构建过程分解为多个步骤,每个步骤由具体的建造者负责实现,可以使得对象的构建过程更加清晰和可控。
  2. 创建多个相似对象:当需要创建多个具有相同构建过程但具有不同表示的对象时,可以使用建造者模式。通过在同一个构建过程下,使用不同的具体建造者,可以创建多个不同的对象表示。
  3. 隐藏对象的构建细节:当需要隐藏对象的构建细节,使得客户端代码与具体构建过程解耦时,可以使用建造者模式。客户端只需关注指导者类和抽象建造者类,不需要知道具体的构建过程和实现细节。
  4. 构建过程灵活可变:当对象的构建过程需要根据不同的需求进行灵活变化时,可以使用建造者模式。通过定义不同的具体建造者,可以根据不同的需求选择合适的建造者,从而构建出不同的对象。
  5. 代码的可读性和可维护性要求较高:当需要编写易于阅读和维护的代码时,可以使用建造者模式。通过将复杂的构建过程封装在具体建造者中,使得客户端代码更加简洁和易于理解。

总的来说,建造者模式适用于需要创建复杂对象、隐藏构建细节、灵活变化构建过程、创建多个相似对象以及提高代码可读性和可维护性的场景。


四、建造者模式面试题

  1. 什么是建造者模式?它的作用是什么?
  2. 建造者模式与工厂模式有什么区别?
  3. Builder模式中的角色有哪些?
  4. 建造者模式的优点是什么?
  5. 如何实现一个简单的建造者模式?
  6. 建造者模式的适用场景是什么?
  7. 建造者模式有什么缺点或限制?
  8. 如何在建造者模式中实现可选参数?
  9. 如何在建造者模式中处理依赖关系?
  10. 建造者模式和装饰者模式之间有什么区别?
相关文章
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1007 157
|
8月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
839 2
|
10月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
8月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2141 35
|
8月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
601 8
|
10月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
10月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
10月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
10月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
122 0
|
11月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
215 0