JAVA设计模式之建造者模式

基本概念

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

类图

建造者模式主要包含4个角色:

抽象建造者(Builder):要构建的目标对象所需要的"零部件",大多是接口。

具体建造者(ConcreteBuilder):Builder的实现类,提供创建方法以及产品实例。

产品类(Product):要构建的对象,内部包含很多其他的"零部件对象"。

指挥者类(Director):负责调用Builder的方法构建对象,返回实例,对调用者屏蔽了具体的构建过程,构建者一般只与指挥者类打交道。

代码实现

java 复制代码
/**
 * 产品类
 */
public class Car {
    private String window;
    private String tyre;
    private String seat;
    private boolean ai;

    public boolean getAi() {
        return ai;
    }

    public void setAi(boolean ai) {
        this.ai = ai;
    }

    public String getWindow() {
        return window;
    }

    public void setWindow(String window) {
        this.window = window;
    }

    public String getTyre() {
        return tyre;
    }

    public void setTyre(String tyre) {
        this.tyre = tyre;
    }

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }

    @Override
    public String toString() {
        String rs = "这款汽车有:" + this.getSeat() + "、" + this.getTyre()  + "、" + this.getWindow();
        if(this.getAi()){
            rs += "、自动驾驶";
        }
        return rs;
    }
}
java 复制代码
/**
 * 抽象建造者
 */
public interface ICarBuilder {
    public ICarBuilder setWindows(String window);
    public ICarBuilder setSeat(String seat);
    public ICarBuilder setTyre(String tyre);
    public ICarBuilder setAI(boolean ai);

    public Car createCar();
}
java 复制代码
/**
 * 具体建造者
 */
public class CarBuilder implements ICarBuilder{
    private Car car = new Car();
    @Override
    public ICarBuilder setWindows(String window) {
        this.car.setWindow(window);
        System.out.println("给汽车安装[" + window + "]");
        return this;
    }

    @Override
    public ICarBuilder setSeat(String seat) {
        this.car.setSeat(seat);
        System.out.println("给汽车安装[" + seat + "]");
        return this;
    }

    @Override
    public ICarBuilder setTyre(String tyre) {
        this.car.setTyre(tyre);
        System.out.println("给汽车安装[" + tyre + "]");
        return this;
    }

    @Override
    public ICarBuilder setAI(boolean ai) {
        this.car.setAi(ai);
        if (ai){
            System.out.println("给汽车安装[自动驾驶]");
        }
        return this;
    }

    @Override
    public Car createCar() {
        return this.car;
    }

}
java 复制代码
/**
 * 指挥者
 */
public class CarDirector {
    public Car createCar(ICarBuilder carBuilder){
        carBuilder.setSeat("加热座椅")
                .setTyre("耐磨轮胎")
                .setWindows("普通窗户");
        Car car = carBuilder.createCar();
        return car;
    }

    public Car createAICar(ICarBuilder carBuilder){
        carBuilder.setSeat("加热座椅")
                .setTyre("耐磨轮胎")
                .setWindows("普通窗户")
                .setAI(true);
        Car car = carBuilder.createCar();
        return car;
    }

}
java 复制代码
/** 测试 **/
public class Client {
    public static void main(String[] args) {
        CarDirector director = new CarDirector();
        Car car = director.createCar(new CarBuilder());
        System.out.println(car.toString());

        System.out.println("---------------------------------");
        Car aiCar = director.createAICar(new CarBuilder());
        System.out.println(aiCar);
    }
}

运行结果

复制代码
给汽车安装[加热座椅]
给汽车安装[耐磨轮胎]
给汽车安装[普通窗户]
这款汽车有:加热座椅、耐磨轮胎、普通窗户
---------------------------------
给汽车安装[加热座椅]
给汽车安装[耐磨轮胎]
给汽车安装[普通窗户]
给汽车安装[自动驾驶]
这款汽车有:加热座椅、耐磨轮胎、普通窗户、自动驾驶
相关推荐
JAVA面经实录9171 小时前
操作系统(面试全覆盖)
java·计算机网络·面试
编程的一拳超人1 小时前
Maven 国内高速镜像推荐(按速度排序)
java·maven
云烟成雨TD2 小时前
Spring AI 1.x 系列【61】Spring AI 2.0 升级指南
java·人工智能·spring
lulu12165440782 小时前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI2 小时前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
(Charon)3 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫3 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
轻刀快马4 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
折哥的程序人生 · 物流技术专研4 小时前
Java 23 种设计模式:从踩坑到精通 | 装饰器模式 —— 比继承更灵活的扩展方式,你用过吗?
java·装饰器模式·java面试·结构型模式·java设计模式·javaio·从踩坑到精通