设计模式详解(建造者模式)

embedded/2024/12/28 1:15:59/

1、简述

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。

在这里插入图片描述

2、什么是建造者模式

建造者模式是一种创建型设计模式,主要用于以下场景:

  • 创建复杂对象时需要多个步骤。

  • 同样的构建过程可以生成不同类型的对象。

建造者模式的核心思想是通过分步骤地构建一个复杂对象,同时允许灵活地定制每个步骤的细节。

建造者模式包含以下几个核心角色:

  • 产品(Product):表示需要构建的复杂对象。

  • 建造者(Builder):定义创建产品各部分的抽象接口。

  • 具体建造者(Concrete Builder):实现 Builder 接口,完成具体产品各部分的构建。

  • 指挥者(Director):负责调用建造者的各个方法,按特定顺序创建产品。

3、实际案例

假设我们需要构建一个快餐套餐,套餐包括主食、饮料和甜品,建造者模式可以帮助我们灵活构建不同的套餐组合。

// 产品类

java">public class Meal {private String mainItem; // 主食private String drink;    // 饮料private String dessert;  // 甜品// Getter 和 Setterpublic String getMainItem() {return mainItem;}public void setMainItem(String mainItem) {this.mainItem = mainItem;}public String getDrink() {return drink;}public void setDrink(String drink) {this.drink = drink;}public String getDessert() {return dessert;}public void setDessert(String dessert) {this.dessert = dessert;}@Overridepublic String toString() {return "Meal [Main Item: " + mainItem + ", Drink: " + drink + ", Dessert: " + dessert + "]";}
}

// 抽象建造者

java">public interface MealBuilder {void buildMainItem();void buildDrink();void buildDessert();Meal getMeal();
}

// 具体建造者:儿童套餐

java">public class KidsMealBuilder implements MealBuilder {private Meal meal = new Meal();@Overridepublic void buildMainItem() {meal.setMainItem("Chicken Nuggets");}@Overridepublic void buildDrink() {meal.setDrink("Apple Juice");}@Overridepublic void buildDessert() {meal.setDessert("Ice Cream");}@Overridepublic Meal getMeal() {return meal;}
}

// 具体建造者:健身餐

java">public class FitnessMealBuilder implements MealBuilder {private Meal meal = new Meal();@Overridepublic void buildMainItem() {meal.setMainItem("Grilled Chicken");}@Overridepublic void buildDrink() {meal.setDrink("Protein Shake");}@Overridepublic void buildDessert() {meal.setDessert("Greek Yogurt");}@Overridepublic Meal getMeal() {return meal;}
}

// 指挥者

java">public class MealDirector {private MealBuilder mealBuilder;public MealDirector(MealBuilder mealBuilder) {this.mealBuilder = mealBuilder;}public void constructMeal() {mealBuilder.buildMainItem();mealBuilder.buildDrink();mealBuilder.buildDessert();}public Meal getMeal() {return mealBuilder.getMeal();}
}

// 测试类

java">public class BuilderPatternDemo {public static void main(String[] args) {// 创建儿童套餐MealBuilder kidsMealBuilder = new KidsMealBuilder();MealDirector kidsMealDirector = new MealDirector(kidsMealBuilder);kidsMealDirector.constructMeal();Meal kidsMeal = kidsMealDirector.getMeal();System.out.println("Kids Meal: " + kidsMeal);// 创建健身餐MealBuilder fitnessMealBuilder = new FitnessMealBuilder();MealDirector fitnessMealDirector = new MealDirector(fitnessMealBuilder);fitnessMealDirector.constructMeal();Meal fitnessMeal = fitnessMealDirector.getMeal();System.out.println("Fitness Meal: " + fitnessMeal);}
}

输出:

Kids Meal: Meal [Main Item: Chicken Nuggets, Drink: Apple Juice, Dessert: Ice Cream]
Fitness Meal: Meal [Main Item: Grilled Chicken, Drink: Protein Shake, Dessert: Greek Yogurt]

4、建造者模式的优缺点

优点

  • 分步骤构建:将复杂对象的构造过程分解为多个步骤,代码更加清晰。

  • 灵活性:同样的构造过程可以创建不同的表示。

  • 解耦:将产品的创建过程与产品本身分离。

缺点

  • 额外的类:需要为每种产品创建具体的建造者类。

  • 复杂性增加:如果产品的构建过程过于简单,使用建造者模式可能导致不必要的复杂性。

5、应用场景

  • 构建复杂对象:如构建包含多步骤的报表、表单或配置文件。

  • UI 界面生成:如构建复杂的用户界面时,可以按步骤生成组件。

  • 代码生成工具:如编译器的代码生成模块,逐步构建复杂的语法树或代码结构。


http://www.ppmy.cn/embedded/149313.html

相关文章

【网络云计算】2024第52周-每日【2024/12/23】小测-理论实操

文章目录 1、写5个if和系统管理相关的控制语句,不能低于5行,且是运维SRE必备的实用脚本,回答分为理论和实操两部分,理论写核心的实现思路,实操录屏和写文档,写脚本的具体实现2、基于eNSP做一个交换机的实验…

免费线上签字小程序,开启便捷电子签名

虽如今数字化飞速发展的时代,但线上签名小程序的开发制作却并非易事。需要攻克诸多技术难题,例如确保签名的真实性与唯一性,防止签名被伪造或篡改。 要精准地捕捉用户手写签名的笔迹特征,无论是笔画的粗细、轻重,还是…

Java中三大构建工具的发展历程(Ant、Maven和Gradle)

🐸 背景 我们要写一个Java程序,一般的步骤是编译,测试,打包。 这个构建的过程,如果文件比较少,我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大,文件越来越多&#xff0c…

springboot489基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

mybatis/mybatisplus

一、mybatis 1.什么是 持久化框架。通过XML或注解的方式将实体类和SQL语句进行映射,开发者快速进行CRUD操作。 2.核心组件 (1)SqlSessionFactory 创建SqlSession实例。用于执行SQL操作 。代码 String resource "org/mybatis/example/mybatis-config.xml&q…

Redis分片集群+MQ处理高并发

Redis的三大集群模式:主从复制、哨兵模式和Cluster模式。每种模式都有其特点和应用场景,具体如下: 主从复制模式:适用于数据备份和读写分离场景,配置简单,但在主节点故障时需要手动切换。哨兵模式&#xff…

查看mysql编译参数

cat /usr/local/mysql/bin/mysqlbug|grep configure This is set by configure CONFIGURE_LINE“./configure ‘–prefix/usr/local/mysql’ ‘–localstatedir/var/lib/mysql’ ‘–with-commentSource’ ‘–with-server-suffix-Linuxtone’ ‘–with-mysqld-usermysql’ ‘…

【ES6复习笔记】模板字符串(3)

介绍 模板字符串是 ES6 引入的一种新的字符串声明方式,它使用反引号()来定义字符串,而不是单引号()或双引号(")。模板字符串可以包含变量、表达式和换行符,这使得它…