设计模式 - 建造者模式

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

引言

建造者模式是一种创建型设计模式,它允许你逐步构建复杂对象。该模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。这种模式非常适合于构建具有大量可选部分的复杂对象。本文将详细介绍建造者模式的概念,并通过具体的Java代码示例来说明如何实现这一模式。

一、建造者模式的基本概念

建造者模式的主要参与者包括:

  1. Builder:定义了构建对象各个部分的公共接口。
  2. ConcreteBuilder:实现了 Builder 接口,并构建和组装各个部分,最终返回结果对象。
  3. Director:构造一个使用 Builder 接口的对象。
  4. Product:要构建的复杂对象。

二、建造者模式的实现

接下来,我们将通过一个示例来详细了解建造者模式的实现步骤。

1. 定义产品类

首先,定义产品类,即要构建的复杂对象:

java 复制代码
// 产品类
public class Meal {
    private String name;
    private String drink;
    private String side;
    private String mainCourse;

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

    public String getName() {
        return name;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public void setMainCourse(String mainCourse) {
        this.mainCourse = mainCourse;
    }

    @Override
    public String toString() {
        return "Meal{" +
                "name='" + name + '\'' +
                ", drink='" + drink + '\'' +
                ", side='" + side + '\'' +
                ", mainCourse='" + mainCourse + '\'' +
                '}';
    }
}
2. 定义抽象建造者接口

定义抽象建造者接口,该接口声明了构建产品各个部分的方法:

java 复制代码
// 抽象建造者接口
public abstract class MealBuilder {
    protected Meal meal;

    public MealBuilder(Meal meal) {
        this.meal = meal;
    }

    public abstract void buildName();
    public abstract void buildDrink();
    public abstract void buildSide();
    public abstract void buildMainCourse();
}
3. 定义具体建造者类

实现抽象建造者接口,具体建造者类负责构建和组装各个部分:

java 复制代码
// 具体建造者类
public class BreakfastBuilder extends MealBuilder {
    public BreakfastBuilder(Meal meal) {
        super(meal);
    }

    @Override
    public void buildName() {
        meal.setName("Breakfast");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("Orange Juice");
    }

    @Override
    public void buildSide() {
        meal.setSide("Toast");
    }

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Eggs");
    }
}

public class LunchBuilder extends MealBuilder {
    public LunchBuilder(Meal meal) {
        super(meal);
    }

    @Override
    public void buildName() {
        meal.setName("Lunch");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("Iced Tea");
    }

    @Override
    public void buildSide() {
        meal.setSide("Fries");
    }

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Burger");
    }
}
4. 定义指导者类

定义指导者类,指导者类负责调用建造者的各个方法来完成产品的构建:

java 复制代码
// 指导者类
public class MealDirector {
    private MealBuilder builder;

    public MealDirector(MealBuilder builder) {
        this.builder = builder;
    }

    public Meal construct() {
        builder.buildName();
        builder.buildDrink();
        builder.buildSide();
        builder.buildMainCourse();
        return builder.meal;
    }
}
5. 客户端代码

客户端代码使用指导者来构建产品:

java 复制代码
public class ClientApplication {
    public static void main(String[] args) {
        Meal breakfast = new Meal("Breakfast");
        Meal lunch = new Meal("Lunch");

        MealDirector director = new MealDirector(new BreakfastBuilder(breakfast));
        director.construct();
        System.out.println(breakfast);

        director = new MealDirector(new LunchBuilder(lunch));
        director.construct();
        System.out.println(lunch);
    }
}

三、建造者模式的优点

  1. 分离构建过程与表示:建造者模式将构建过程与表示分离,使得同一构建过程可以创建不同的表示。
  2. 易于扩展:当需要添加新的产品特性时,可以通过添加新的具体建造者类来实现。
  3. 更好的控制构建过程:指导者类负责控制构建过程,使得客户端代码更加清晰。

四、建造者模式的缺点

  1. 增加类的数量:建造者模式会增加类的数量,尤其是当产品较为复杂时。
  2. 违反单一职责原则:具体建造者类可能承担了过多的构建职责。

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

建造者模式适用于以下情况:

  1. 构建复杂对象:当构建复杂对象的过程很复杂,或者对象的组成部分很多时。
  2. 配置多样化:当对象的构建过程需要配置不同的选项时。
  3. 产品族:当需要创建一系列相关或相互依赖的对象时。

六、建造者模式的扩展

在实际应用中,可以通过以下方式扩展建造者模式:

  1. 分层建造者:如果产品族本身也可以分类,可以创建多个层次的建造者,每个层次负责构建不同类别的产品族。
  2. 参数化建造者:允许客户端通过参数来指定具体建造者,从而在运行时动态选择产品族。

七、建造者模式与工厂模式的区别

建造者模式和工厂模式都是创建型设计模式,但它们之间存在显著差异:

  1. 目的:工厂模式关注的是如何创建对象,而建造者模式关注的是如何构建对象。
  2. 适用范围:工厂模式适用于创建简单的对象,而建造者模式适用于构建复杂的对象。
  3. 构建过程:工厂模式的构建过程是一步到位的,而建造者模式的构建过程是逐步进行的。

八、总结

通过本文的详细介绍和示例代码,相信你应该已经了解了建造者模式的基本实现细节及其在不同情况下的表现。建造者模式是面向对象设计中一种非常有用的模式,特别是在需要构建复杂对象的情况下。在实际编程中,建造者模式可以用于创建高度可配置和可扩展的系统,尤其是在需要支持多种不同类型的产品时。通过上述实现,你可以根据自己的需求进一步扩展和优化建造者模式的应用。

建造者模式虽然简单,但在设计系统时需要考虑到其潜在的问题,比如类的数量增加等。正确地使用建造者模式可以使你的代码更加健壮和易于维护。


💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

设计模式相关文章索引 文章链接
设计模式 - 抽象工厂模式 设计模式 - 抽象工厂模式
设计模式 - 单例模式 设计模式 - 单例模式

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
DKPT1 分钟前
数据结构之快速排序、堆排序概念与实现举例
java·数据结构·算法
尘浮生4 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·spring·maven
lj9077226441 小时前
Dockerfile部署xxljob
java·docker
多则惑少则明1 小时前
idea 编辑器常用插件集合
java·编辑器·intellij-idea
BLUcoding1 小时前
RabbitMQ08_保证消息可靠性
java·rabbitmq
MogulNemenis1 小时前
力扣415周赛
java·数据结构·算法·leetcode
ai安歌1 小时前
【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目
java·开发语言·后端·tomcat·web·intellij idea
2407-2 shw1 小时前
weblogic CVE-2018-2894 靶场攻略
java·运维·服务器·安全·weblogic
尘浮生1 小时前
Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·mysql·spring
lizhou8282 小时前
win10下使用docker、k8s部署java应用
java·docker·kubernetes