Java设计模式:建造者模式详解

简介: 建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。

建造者模式(Builder Pattern)是一种创建型设计模式,其核心思想是通过将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。建造者模式提供了一种灵活的方式来构建复杂对象,从而提高代码的可读性和可维护性。

本文将从建造者模式的原理、背景、应用场景以及实际Demo等多个角度来详细介绍建造者模式。

一、建造者模式的原理

建造者模式的主要目标是将对象的构建过程封装起来,使得客户端代码能够通过简单的接口构建复杂对象。在建造者模式中,核心是提供一个建造者接口和多个具体建造者类,具体建造者类负责创建产品的不同部分,最终由指挥者类协调各个建造者完成对象的构建。其基本结构如下:

  • 产品(Product) :表示要创建的复杂对象,包含多个组成部分。
  • 建造者(Builder) :定义创建产品的抽象接口,声明构建产品各个部分的方法。
  • 具体建造者(ConcreteBuilder) :实现建造者接口,提供构建产品的具体实现。
  • 指挥者(Director) :负责控制建造过程,按照特定的顺序调用建造者的方法。

二、建造者模式的背景

在面向对象编程中,当一个对象的构建过程涉及多个步骤时,传统的构造函数方式可能导致代码变得复杂且难以维护。尤其是在需要多个可选参数的情况下,构造函数可能会变得冗长,影响代码的可读性。建造者模式通过将构建过程分离,使得创建复杂对象变得更加清晰和灵活,符合开闭原则(对扩展开放、对修改关闭)。

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

建造者模式适用于以下几种场景:

  • 复杂对象的构建:当对象的构建需要多个步骤,且步骤之间有依赖关系时,建造者模式能够简化构建过程。
  • 多个可选参数:当对象的构造需要多个可选参数时,使用建造者模式可以避免构造函数参数过多的问题。
  • 不同表现形式的对象:当需要构建的对象具有多种不同表现时,建造者模式可以通过不同的建造者创建不同的对象实例。

四、建造者模式的分类及实现

建造者模式通常没有严格的分类,其实现通常围绕一个产品类和多个建造者类展开。以下是一个简单的建造者模式实现示例:

1. 定义产品类

typescript

代码解读

复制代码

java
复制代码
// 产品类
class House {
    private String foundation;
    private String walls;
    private String roof;
    private int floors;

    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }

    public void setWalls(String walls) {
        this.walls = walls;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }

    public void setFloors(int floors) {
        this.floors = floors;
    }

    @Override
    public String toString() {
        return "House{" +
                "foundation='" + foundation + ''' +
                ", walls='" + walls + ''' +
                ", roof='" + roof + ''' +
                ", floors=" + floors +
                '}';
    }
}

2. 定义建造者接口

csharp

代码解读

复制代码

java
复制代码
// 建造者接口
interface HouseBuilder {
    void buildFoundation();
    void buildWalls();
    void buildRoof();
    void buildFloors(int floors);
    House build();
}

3. 创建具体建造者实现

typescript

代码解读

复制代码

java
复制代码
// 具体建造者
class ConcreteHouseBuilder implements HouseBuilder {
    private House house;

    public ConcreteHouseBuilder() {
        this.house = new House();
    }

    @Override
    public void buildFoundation() {
        house.setFoundation("Concrete Foundation");
    }

    @Override
    public void buildWalls() {
        house.setWalls("Brick Walls");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Gable Roof");
    }

    @Override
    public void buildFloors(int floors) {
        house.setFloors(floors);
    }

    @Override
    public House build() {
        return house;
    }
}

4. 定义指挥者类

csharp

代码解读

复制代码

java
复制代码
// 指挥者类
class HouseDirector {
    private HouseBuilder builder;

    public HouseDirector(HouseBuilder builder) {
        this.builder = builder;
    }

    public House constructHouse() {
        builder.buildFoundation();
        builder.buildWalls();
        builder.buildRoof();
        builder.buildFloors(2); // 默认构建2层
        return builder.build();
    }
}

5. 客户端代码

ini

代码解读

复制代码

java
复制代码
public class Main {
    public static void main(String[] args) {
        HouseBuilder builder = new ConcreteHouseBuilder();
        HouseDirector director = new HouseDirector(builder);
        
        House house = director.constructHouse();
        System.out.println(house);
    }
}

五、建造者模式的实际应用Demo

以一个餐厅的订单系统为例,顾客可以通过不同的选项来定制他们的餐点,使用建造者模式可以根据顾客的选择构建不同的餐点。

typescript

代码解读

复制代码

java
复制代码
// 餐点类
class Meal {
    private String mainCourse;
    private String drink;
    private String dessert;

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

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

    public void setDessert(String dessert) {
        this.dessert = dessert;
    }

    @Override
    public String toString() {
        return "Meal{" +
                "mainCourse='" + mainCourse + ''' +
                ", drink='" + drink + ''' +
                ", dessert='" + dessert + ''' +
                '}';
    }
}

// 建造者接口
interface MealBuilder {
    void buildMainCourse(String mainCourse);
    void buildDrink(String drink);
    void buildDessert(String dessert);
    Meal build();
}

// 具体建造者
class ConcreteMealBuilder implements MealBuilder {
    private Meal meal;

    public ConcreteMealBuilder() {
        this.meal = new Meal();
    }

    @Override
    public void buildMainCourse(String mainCourse) {
        meal.setMainCourse(mainCourse);
    }

    @Override
    public void buildDrink(String drink) {
        meal.setDrink(drink);
    }

    @Override
    public void buildDessert(String dessert) {
        meal.setDessert(dessert);
    }

    @Override
    public Meal build() {
        return meal;
    }
}

// 指挥者类
class MealDirector {
    private MealBuilder builder;

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

    public Meal constructMeal(String mainCourse, String drink, String dessert) {
        builder.buildMainCourse(mainCourse);
        builder.buildDrink(drink);
        builder.buildDessert(dessert);
        return builder.build();
    }
}

使用示例

在实际应用中,可以根据顾客的选择构建不同的餐点:

java

代码解读

复制代码

java
复制代码
public class Client {
    public static void main(String[] args) {
        MealBuilder builder = new ConcreteMealBuilder();
        MealDirector director = new MealDirector(builder);
        
        Meal meal = director.constructMeal("Steak", "Wine", "Cheesecake");
        System.out.println(meal); // 输出:Meal{mainCourse='Steak', drink='Wine', dessert='Cheesecake'}
    }
}

总结

建造者模式通过将复杂对象的构建过程进行抽象和模块化,使得对象的创建更加灵活和可控。它不仅提高了代码的可读性和可维护性,还能在对象构建过程中支持不同的表现形式。掌握建造者模式在处理复杂对象创建时非常有用,能够显著提升代码质量和开发效率。


转载来源:https://juejin.cn/post/7426647926589882419

相关文章
|
4天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
8天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
4天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
13天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
15天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
4天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
502 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
11天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
985 3
|
8天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
412 17
白话文讲解大模型| Attention is all you need
|
8天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
560 5
|
4天前
|
安全 网络安全
您有一份网络安全攻略待领取!!!
深入了解如何保护自己的云上资产,领取超酷的安全海报和定制鼠标垫,随时随地提醒你保持警惕!
697 1
您有一份网络安全攻略待领取!!!