建造者模式(Builder Pattern)

embedded/2024/12/28 2:01:36/

建造者模式(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/embedded/149324.html

相关文章

各种网站(学习资源、常用工具及其他,持续更新中~)

欢迎围观笔者的个人博客~ 也欢迎通过RSS网址https://kangaroogao.github.io/atom.xml进行订阅~ 大学指南 上海交通大学生存手册中国科学技术大学人工智能与数据科学学院本科进阶指南USTC不完全入学指南大学生活质量指北科研论 信息搜集 AI信息搜集USTC飞跃网站计算机保研 技…

PyQt实战——随机涂格子的特色进度条(十一)

系类往期文章: PyQt5实战——多脚本集合包,前言与环境配置(一) PyQt5实战——多脚本集合包,UI以及工程布局(二) PyQt5实战——多脚本集合包,程序入口QMainWindow(三&…

5G -- 网络安全

网络安全威胁 域外:运营商网络域外关键安全威胁 一、空口安全威胁 用户数据、信息窃听/篡改DDos攻击拒绝用户接入非授权终端违法接入网络伪基站触发终端降维攻击空口恶意干扰 二、Internet安全威胁 用户数据传输泄露、篡改仿冒网络应用拒绝特定服务Internet侧DDos攻击&…

深度解析:Maven 和 Gradle 的使用比较及常见仓库推荐

Maven 和 Gradle 是 Java 项目中最常用的构建工具。它们各有优势,适用于不同的场景。本文将对两者进行详细的对比,并推荐一些常用的 Maven 和 Gradle 仓库,帮助开发者高效管理依赖。 一、Maven 和 Gradle 的使用比较 1.1 基本介绍 Maven 基…

抖去推碰一碰系统技术源码/open SDK转发技术开发

抖去推碰一碰系统技术源码/open SDK转发技术开发 碰一碰智能系统#碰碰卡系统#碰一碰系统#碰一碰系统技术源头开发 碰碰卡智能营销系统开发是一种集成了人工智能和NFC技术的工具,碰碰卡智能营销系统通过整合数据分析、客户关系管理、自动化营销活动、多渠道整合和个…

opencv中的各种滤波器简介

在 OpenCV 中,滤波器是图像处理中的重要工具,用于对图像进行平滑、去噪、边缘检测等操作。以下是几种常见滤波器的简单介绍。 1. 均值滤波 (Mean Filter) 功能: 对图像进行平滑处理,减少噪声。 应用场景: 去除图像…

MIT实验笔记冲刺2 实验部分

目录 实现trace调用(系统调用跟踪(中等)) 攻击 xv6(中等) 下面就是实验的部分,Lab2中的实验有两个。一个是syscall implementations,另一个则是利用未抹除的内存内容来读取上一个内…

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树,以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​,其中 n 个不同的键按排序顺序 ,我们希望构造一个二叉搜索树。 对于每个关键 ki​,我们有一个…