【设计模式】创建型模式(四):建造者模式

设计模式之创建型模式》系列,共包含以下文章:

  • 创建型模式(一):工厂模式
  • 创建型模式(二):抽象工厂模式
  • 创建型模式(三):单例模式
  • 创建型模式(四):建造者模式
  • 创建型模式(五):原型模式

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

创建型模式(四):建造者模式

  • 1.概念
  • 2.案例
  • 3.优化

1.概念

建造者模式 是一种创建型设计模式,它允许你创建复杂对象的步骤与表示方式相分离。

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的 构建过程 与其 表示 相分离,从而可以创建具有不同表示形式的对象。

概要
说明
意图将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。
何时使用当一些基本部件不变,而其组合经常变化时。
如何解决将变与不变的部分分离开。
关键代码1️⃣ 建造者:创建并提供实例。
2️⃣ 导演:管理建造出来的实例的依赖关系和控制构建过程。
应用实例1️⃣ 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的 “套餐”。
2️⃣ Java 中的 StringBuilder。
优点1️⃣ 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
2️⃣ 可以更好地控制构建过程,隐藏具体构建细节。
3️⃣ 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点1️⃣ 如果产品的属性较少,建造者模式可能会导致代码冗余。
2️⃣ 增加了系统的类和对象数量。
使用场景1️⃣ 需要生成的对象具有复杂的内部结构。
2️⃣ 需要生成的对象内部属性相互依赖。
注意事项与工厂模式的区别是:建造者模式更加关注于零件装配的顺序。

建造者模式包含以下几个主要角色:

  • 指导者Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。
  • 抽象建造者Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。
  • 具体建造者Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。
  • 产品Product):要构建的复杂对象。产品类通常包含多个部分或属性。

在这里插入图片描述

2.案例

我们假设一个快餐店的商业案例,其中,一个典型的 套餐 可以是一个 汉堡(Burger)和一杯 冷饮(Cold Drink)。

  • 汉堡(Burger)可以是 素食汉堡(Veg Burger)或 鸡肉汉堡(Chicken Burger),它们是包在 纸盒 中。
  • 冷饮(Cold Drink)可以是 可口可乐(Coke)或 百事可乐(Pepsi),它们是装在 瓶子 中。

我们将创建一个表示 食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示 食物包装 的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个 通过结合 Item 来创建不同类型的 Meal 对象MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal。

在这里插入图片描述

  • 1️⃣ Item.javaPacking.java:创建一个表示 食物条目食物包装 的接口。
public interface Item {public String name();public Packing packing();public float price();    
}
public interface Packing {public String pack();
}
  • 2️⃣ Wrapper.javaBottle.java:创建实现 Packing 接口的实体类。
public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}
public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}
  • 3️⃣ Burger.javaColdDrink.java:创建实现 Item 接口的抽象类,该类提供了默认的功能。
public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();
}
public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();
}
  • 4️⃣ VegBurger.javaChickenBurger.javaCoke.javaPepsi.java:创建扩展了 Burger 和 ColdDrink 的实体类。
public class VegBurger extends Burger {@Overridepublic float price() {return 25.0f;}@Overridepublic String name() {return "Veg Burger";}
}
public class ChickenBurger extends Burger {@Overridepublic float price() {return 50.5f;}@Overridepublic String name() {return "Chicken Burger";}
}
public class Coke extends ColdDrink {@Overridepublic float price() {return 30.0f;}@Overridepublic String name() {return "Coke";}
}
public class Pepsi extends ColdDrink {@Overridepublic float price() {return 35.0f;}@Overridepublic String name() {return "Pepsi";}
}
  • 5️⃣ Meal.java:创建一个 Meal 类,带有上面定义的 Item 对象。
import java.util.ArrayList;
import java.util.List;public class Meal {private List<Item> items = new ArrayList<Item>();    public void addItem(Item item){items.add(item);}public float getCost(){float cost = 0.0f;for (Item item : items) {cost += item.price();}        return cost;}public void showItems(){for (Item item : items) {System.out.print("Item : " + item.name());System.out.print(", Packing : " + item.packing().pack());System.out.println(", Price : " + item.price());}        }    
}
  • 6️⃣ MealBuilder.java:创建一个 MealBuilder 类,实际的 Builder 类负责创建 Meal 对象。
public class MealBuilder {public Meal prepareVegMeal () {Meal meal = new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;}   public Meal prepareNonVegMeal () {Meal meal = new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}
  • 7️⃣ BuilderPatternDemo.java:BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。
public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder = new MealBuilder();Meal vegMeal = mealBuilder.prepareVegMeal();System.out.println("Veg Meal");vegMeal.showItems();System.out.println("Total Cost: " + vegMeal.getCost());Meal nonVegMeal = mealBuilder.prepareNonVegMeal();System.out.println("\n\nNon-Veg Meal");nonVegMeal.showItems();System.out.println("Total Cost: " + nonVegMeal.getCost());}
}
  • 8️⃣ 执行程序,输出结果。
Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5

3.优化

我们将第 2 节中的步骤 6️⃣ 和 7️⃣ 拆解一下,使之更清晰。

  • 指导者
public class Director {    public void Constuct(Builder builder){        builder.prepareVegMeal();        builder.prepareNonVegMeal();    }
}
  • 抽象建造者
public class Builder {    public Meal meal = new Meal();    public void prepareVegMeal() {};    public void prepareNonVegMeal() {};    public Meal getMeal() { return null };
};
  • 具体建造者 1
public class VegMealBuilder extends Builder{@Override    public void prepareVegMeal() {        meal.addItem(new VegBurger());        meal.addItem(new Coke());}@Override    public void prepareNonVegMeal() { }    @Overridepublic Meal getMeal() {        return meal;    }
}
  • 具体建造者 2
public class NonVegMealBuilder extends Builder {    @Override    public void prepareVegMeal() { }    @Override    public void prepareNonVegMeal() {        meal.addItem(new ChickenBurger());        meal.addItem(new Pepsi());    }    @Override   public Meal getMeal() {        return meal;    }
}
  • Client
public class Test {    @Test    public void BuilderPatternDemo() {// 创建指挥者        Director director = new Director();        // 创建建造者VegMealBuilder b1 = new VegMealBuilder();        NonVegMealBuilder b2 = new NonVegMealBuilder();        // 注入建造者,然后指挥者构建午餐director.Constuct(b1);        director.Constuct(b2);        // 获取构建好的 Meal 对象Meal vegMeal = b1.getMeal();        System.out.println("Veg Meal");        vegMeal.showItems();        System.out.println("Total Cost: " +vegMeal.getCost());        // 获取构建好的 Meal 对象Meal nonVegMeal = b2.getMeal();        System.out.println("\n\nNon-Veg Meal");        nonVegMeal.showItems();       System.out.println("Total Cost: " +nonVegMeal.getCost());    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431000.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android14请求动态申请存储权限

Android14请求动态申请存储权限 Android14和Android15存储权限有增加多了选择部分&#xff0c;还是全部。一个小小的存储权限真的被它玩出了花来。本来Android13就将存储权限进行了3个细分&#xff0c;是图片&#xff0c;音频还是视频文件。 步骤一&#xff1a;AndroidManife…

峟思:山洪灾害监测预警系统全面解析

在自然灾害频发的今天&#xff0c;山洪灾害以其突发性强、破坏力大而备受关注。为了有效预防和减少山洪灾害带来的损失&#xff0c;山洪灾害监测预警系统应运而生。本文将详细介绍该系统的主要组成部分、关键传感器及其工作机制&#xff0c;以期为防灾减灾工作提供有力支持。 山…

项目小总结

这段时间主要把大概的开发流程了解完毕 修改了&#xff0c;并画了几个界面 一.界面 修改为 博客主页 个人中心 二.前后端分离开发 写前端时 就可以假设拿到这些数据了 const blogData2 {blog:{id:1,title: "如何编程飞人",author_id: 1,content: "这是一篇…

最新版C/C++通过CLion2024进行Linux远程开发保姆级教学

目前来说&#xff0c;对Linux远程开发支持相对比较好的也就是Clion和VSCode了&#xff0c;这两个其实对于C和C语言开发都很友好&#xff0c;大可不必过于纠结使用那个&#xff0c;至于VS和QtCreator&#xff0c;前者太过重量级了&#xff0c;后者更是不用说&#xff0c;主要用于…

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明&#xff0c;大型语言模型&#xff08;llms&#xff09;可以应用于将自然语言应用于各种各样的机器人技能。然而&#xff0c;在实践中&#xff0c;学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…

vue node node-sass sass-loader 版本 对应 与 兼容

警告&#xff1a; LibSass 和 Node Sass 已弃用。虽然它们将继续无限期地接收维护版本&#xff0c;但没有计划添加其他功能或与任何新的 CSS 或 Sass 功能兼容。仍在使用它的项目应该转移到 Dart Sass。 sass Sass是一种预处理器脚本语言&#xff0c;可以解释或编译成…

Java—反射机制详解

介绍反射 反射的基本概念 反射&#xff08;Reflection&#xff09;是Java语言中的一种机制&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法等类的内部结构。通过反射&#xff0c;你可以在运行时获取类的信息&#xff0c;包括类的构造器、字段、方法等&#xf…

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时&#xff0c;遭遇报错。具体报错信息如下&#xff1a; ‘NODE_OPTIONS‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…

机器翻译之创建Seq2Seq的编码器、解码器

1.创建编码器、解码器的基类 1.1创建编码器的基类 from torch import nn#构建编码器的基类 class Encoder(nn.Module): #继承父类nn.Moduledef __init__(self, **kwargs): #**kwargs&#xff1a;不定常的关键字参数super().__init__(**kwargs)def forward(self, X, *args…

基于SpringBoot+Vue+MySQL的美食点餐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化快速发展的今天&#xff0c;餐饮行业也迎来了转型升级的重要机遇。传统餐饮管理方式面临效率低下、顾客体验不佳等问题。为此&#xff0c;开发一款基于SpringBootVueMySQL架构的美食点餐管理系统显得尤为重要。该系统旨…

【可图(Kolors)部署与使用】大规模文本到图像生成模型部署与使用教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 1.Kolors 简介 1.1.什么是Kolors&#xff1f; 开发团队 Kolors 是由快手 Kolors 团队…

网页护眼宝——全方位解析 Chrome Dark Reader 插件

网页护眼宝——全方位解析 Chrome Dark Reader 插件 1. 基本介绍&#xff1a;Chrome 插件的力量与 Dark Reader 的独特之处 随着现代浏览器的功能越来越强大&#xff0c;Chrome 插件为用户提供了极大的定制化能力。从广告屏蔽、性能优化到页面翻译&#xff0c;Chrome 插件几乎…

视频监控相关笔记

一、QT 之 QTreeWidget 树形控件 Qt编程指南&#xff0c;Qt新手教程&#xff0c;Qt Programming Guide 一个树形结构的节点中的图表文本 、附带数据的添加&#xff1a; QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item) { // …

C++: unordered系列关联式容器

目录 1. unordered系列关联式容器1.1 unordered_map1.2 unordered_set 2. 哈希概念3. 哈希冲突4. 闭散列5. 开散列 博客主页: 酷酷学 感谢关注!!! 正文开始 1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时…

2024 天池云原生编程挑战赛决赛名单出炉,冠军来自中山大学、昆仑数智战队

9 月 20 日&#xff0c;2024 天池云原生编程挑战赛决赛答辩完美落幕&#xff0c;12 支进入决赛的团队用精彩的答辩&#xff0c;为历时 3 个月的大赛画下了圆满的句号。其中&#xff0c;来自中山大学的陈泓仰以及来自昆仑数智的冉旭欣、沈鑫糠、武鹏鹏&#xff0c; 以出色的方案…

[深度学习]神经网络

1 人工神经网络 全连接神经网络 2 激活函数 隐藏层激活函数由人决定输出层激活函数由解决的任务决定: 二分类:sigmoid多分类:softmax回归:不加激活(恒等激活identify)2.1 sigmoid激活函数 x为加权和小于-6或者大于6,梯度接近于0,会出现梯度消失的问题即使取值 [-6,6] ,…

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…

kubernetes网络(二)之bird实现节点间BGP互联的实验

摘要 上一篇文章中我们学习了calico的原理&#xff0c;kubernetes中的node节点&#xff0c;利用 calico 的 bird 程序相互学习路由&#xff0c;为了加深对 bird 程序的认识&#xff0c;本文我们将使用bird进行实验&#xff0c;实验中实现了BGP FULL MESH模式让宿主相互学习到对…

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日&#xff0c;以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…