设计模式 - 建造者模式

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

文章目录

引言

建造者模式是一种创建型设计模式,它允许你逐步构建复杂对象。该模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。这种模式非常适合于构建具有大量可选部分的复杂对象。本文将详细介绍建造者模式的概念,并通过具体的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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
上等猿6 分钟前
函数式编程&Lambda表达式
java
夏旭泽19 分钟前
设计模式-备忘录模式
设计模式·备忘录模式
蓝染-惣右介24 分钟前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式
秋恬意1 小时前
IBatis和MyBatis在细节上的不同有哪些
java·mybatis
齐 飞2 小时前
BeanFactory和FactoryBean
java·sprint
大霞上仙2 小时前
lxml 解析xml\html
java·服务器·网络
Xiaoweidumpb2 小时前
tomcat temp临时文件不清空,占用硬盘,jdk字体内存泄漏
java·tomcat
AI人H哥会Java2 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
不能只会打代码2 小时前
Java并发编程框架之综合案例—— 分布式日志分析系统(七)
java·开发语言·分布式·java并发框架