建造者模式(Builder Pattern)

devtools/2024/11/23 4:29:52/

建造者模式(Builder Pattern)

建造者模式是一种 创建型设计模式,它将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。


原理

  1. 核心思想:通过一步步的构建过程来创建复杂对象,而不是直接调用构造函数。
  2. 适用场景:需要创建的对象包含多个部分,且构造过程相对复杂时。
  3. 参与角色
    • Builder(抽象建造者):定义构建产品各部分的抽象接口。
    • ConcreteBuilder(具体建造者):实现 Builder 接口,构造并装配具体的产品。
    • Product(产品):要创建的复杂对象。
    • Director(指挥者):定义构造步骤的顺序,将构建过程委托给建造者对象。

优点

  1. 分步构建:允许通过分步骤的方式构造对象,构造过程清晰。
  2. 易于扩展:可以灵活地创建不同的对象表示。
  3. 解耦构建过程与表示:更易维护和扩展。

缺点

  1. 复杂性增加:对于简单对象的创建会显得过于复杂。
  2. 依赖 Director:需要额外引入指挥者角色。

示例代码

场景描述

设计一个 MealBuilder 用于创建不同类型的套餐(如素食套餐和非素食套餐)。每个套餐包含主食(主菜)、饮料和甜品。


1. 定义产品类
java">// 产品类:Meal
public class Meal {private String mainCourse;private String drink;private String dessert;// Setter 方法public void setMainCourse(String mainCourse) {this.mainCourse = mainCourse;}public void setDrink(String drink) {this.drink = drink;}public void setDessert(String dessert) {this.dessert = dessert;}// 展示方法public void showItems() {System.out.println("Meal contains:");System.out.println("Main Course: " + mainCourse);System.out.println("Drink: " + drink);System.out.println("Dessert: " + dessert);}
}

2. 定义抽象建造者
java">// 抽象建造者
public abstract class MealBuilder {protected Meal meal = new Meal();public abstract void buildMainCourse();public abstract void buildDrink();public abstract void buildDessert();// 返回构建好的产品public Meal getMeal() {return meal;}
}

3. 定义具体建造者
java">// 具体建造者:素食套餐
public class VegMealBuilder extends MealBuilder {@Overridepublic void buildMainCourse() {meal.setMainCourse("Vegetable Curry");}@Overridepublic void buildDrink() {meal.setDrink("Lemonade");}@Overridepublic void buildDessert() {meal.setDessert("Fruit Salad");}
}// 具体建造者:非素食套餐
public class NonVegMealBuilder extends MealBuilder {@Overridepublic void buildMainCourse() {meal.setMainCourse("Chicken Curry");}@Overridepublic void buildDrink() {meal.setDrink("Coke");}@Overridepublic void buildDessert() {meal.setDessert("Ice Cream");}
}

4. 定义指挥者
java">// 指挥者
public class MealDirector {private MealBuilder builder;public MealDirector(MealBuilder builder) {this.builder = builder;}public Meal constructMeal() {builder.buildMainCourse();builder.buildDrink();builder.buildDessert();return builder.getMeal();}
}

5. 客户端代码
java">public class BuilderPatternExample {public static void main(String[] args) {// 构建素食套餐MealBuilder vegMealBuilder = new VegMealBuilder();MealDirector vegDirector = new MealDirector(vegMealBuilder);Meal vegMeal = vegDirector.constructMeal();System.out.println("Veg Meal:");vegMeal.showItems();System.out.println("----------------------");// 构建非素食套餐MealBuilder nonVegMealBuilder = new NonVegMealBuilder();MealDirector nonVegDirector = new MealDirector(nonVegMealBuilder);Meal nonVegMeal = nonVegDirector.constructMeal();System.out.println("Non-Veg Meal:");nonVegMeal.showItems();}
}

输出结果
Veg Meal:
Meal contains:
Main Course: Vegetable Curry
Drink: Lemonade
Dessert: Fruit Salad
----------------------
Non-Veg Meal:
Meal contains:
Main Course: Chicken Curry
Drink: Coke
Dessert: Ice Cream

UML 类图

      +----------------+|   Meal         |+----------------+| - mainCourse   || - drink        || - dessert      |+----------------+| + setXXX()     || + showItems()  |+----------------+^|+----------------+| MealBuilder    |+----------------+| + buildXXX()   || + getMeal()    |+----------------+/         \
+---------------+   +-----------------+
| VegMealBuilder|   | NonVegMealBuilder|
+---------------+   +-----------------+^|+----------------+| MealDirector   |+----------------+| - builder      || + constructMeal|+----------------+

适用场景

  1. 复杂对象的创建:对象包含多个组成部分,且构建顺序不可或缺。
  2. 构造过程稳定,表示多样:同一构造流程可用于创建不同表示的对象。
  3. 代码清晰:通过分离构造过程简化了客户端逻辑。

小结

  • 建造者模式适合构建复杂对象并关注构建过程的场景。
  • 它将产品的创建与表示分离,提高了灵活性和扩展性。
  • 缺点:当产品构造步骤或类型较少时,使用该模式可能显得冗余。

http://www.ppmy.cn/devtools/136205.html

相关文章

vue+node+Express+xlsx+emements-plus实现导入excel,并且将数据保存到数据库

vuenodeExpressxlsxemements-plus实现导入excel,并且将数据保存到数据库 前端: pnpm i xlsximport { utils, writeFileXLSX,read } from xlsx准备好DOM,采用的el-upload,使用http-request实现自定义上传,注意这里的action要为空…

手写模拟Spring Boot启动过程功能

引言 Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程&am…

Qt模块学习 —— 数据库连接

目录 前言 架构层说明 驱动程序层 SQL API 层 用户界面层 SQL API 层 数据库实例:QSqlDataBase API Public Functions Static Public Members Protected Functions QSqlRecord 绑定值的方法 API QSqlField API 构造函数与析构函数 成员函数 操作符…

快速简单的视频下载器——lux

文章目录 前言1.环境检查1.1 检查 lux 安装1.2 检查FFmpeg安装1.3 备注 2. lux指令2.1 无OPTIONS2.2 -i 指令2.3 - f 指令2.4 -c 指令2.5 -o 指令2.6 备注 3.结语 前言 在学习之余,发现了一个简单并且高效的视频下载器lux,能够帮你快速且高效的下载文件&#xff08…

HarmonyOs学习笔记-布局单位

鸿蒙开发中布局存在很多单位 鸿蒙的默认单位是vp 下方先展示一下在RrkTsUI中我们应该怎么书写,然后讲一下各大单位具体的含义。 Text("这是一个文本, 用默认单位进行展示,也就是vp") .width(100) .height(100);//此段代码与上方代码是一样的…

Day03_AJAX原理 (黑马笔记)

Day03_AJAX原理 目录 Day03_AJAX原理 学习目标 01.XMLHttpRequest - 基础使用 目标 讲解 小结 02.XMLHttpRequest - 查询参数 目标 讲解 小结 03.案例 - 地区查询 目标 讲解 小结 04.XMLHttpRequest - 数据提交 目标 讲解 小结 05.认识_Promise 目标 讲解…

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体,也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎* 描述:* # Author : geovindu,Geovin Du 涂…

SSM post接口传递json 报错 HTTP状态 415 - 不支持的媒体类型

这篇文章是写给哪些在小破站学习ssm教程的兄弟们,我们都是萌新,大佬就让行吧感谢理解! 本文章主要讲解B站赵伟风SSM教程第108节(JSON数据的接收) 我所有的配置都跟老师一样,老师就很顺利发出去了,我的就是一直415&am…