设计模式-建造者模式

设计模式-建造者模式

    • 传统模式
    • 类JDK8的Builder

别名:创建者模式
建造者模式针对复杂对象,分离它们的构建与表示,达到同样构建过程创建不同表示的目的。
建造者模式封装了复杂对象的构建过程,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

传统模式

class diagram
就拿做三明治来举例,首先定义三明治的抽象类

@Data
public class Sandwich {private String bread;private String meat;private List<String> veg;private String source;public Sandwich(String bread, String meat) {this.bread = bread;this.meat = meat;}
}

然后定义抽象的Builder

public abstract class SandwichBuilder {public abstract void setVeg();public abstract void setSource();public abstract Sandwich getSandwich();
}

现在提供两种实现

public class TunaSandwichBuilder extends SandwichBuilder {private Sandwich sandwich;public TunaSandwichBuilder(String bread) {this.sandwich = new Sandwich(bread, "金枪鱼");}@Overridepublic void setVeg() {sandwich.setVeg(Arrays.asList("番茄", "黄瓜", "生菜"));}@Overridepublic void setSource() {sandwich.setSource("番茄酱");}@Overridepublic Sandwich getSandwich() {return sandwich;}
}public class SirloinSandwichBuilder extends SandwichBuilder {private Sandwich sandwich;public SirloinSandwichBuilder(String bread) {this.sandwich = new Sandwich(bread, "牛腩");}@Overridepublic void setVeg() {sandwich.setVeg(Arrays.asList("青椒", "酱瓜"));}@Overridepublic void setSource() {sandwich.setSource("千岛酱");}@Overridepublic Sandwich getSandwich() {return sandwich;}
}

然后定义一个指挥官

public class SandwichDirector {public void makeSandwich(SandwichBuilder builder){builder.setVeg();builder.setSource();}
}

调用的时候

public class SandwichMaker {public static void main(String[] args) {SandwichDirector director = new SandwichDirector();SandwichBuilder builder = new TunaSandwichBuilder("燕麦面包");director.makeSandwich(builder);Sandwich tunaSandwich = builder.getSandwich();System.out.println(tunaSandwich);builder = new SirloinSandwichBuilder("全麦面包");director.makeSandwich(builder);Sandwich sirSandwich = builder.getSandwich();System.out.println(sirSandwich);}
}

result

类JDK8的Builder

对类Sandwich做改造

@ToString
public class Sandwich {private String bread;private String meat;private List<String> veg;private String source;private Sandwich(Builder builder) {this.bread = builder.bread;this.meat = builder.meat;this.veg = builder.veg;this.source = builder.source;}public static class Builder{private String bread;private String meat;private List<String> veg;private String source;public Builder(String bread, String meat) {this.bread = bread;this.meat = meat;}public Builder veg(List<String> veg){this.veg = veg;return this;}public Builder source(String source){this.source = source;return this;}public Sandwich build(){return new Sandwich(this);}}
}

调用时就可以使用连续构造的哲学

public class BuildDemo {public static void main(String[] args) {Sandwich sandwich = new Sandwich.Builder("蜂蜜面包", "鸡胸肉").veg(Arrays.asList("洋葱", "胡萝卜")).source("BBQ").build();System.out.println(sandwich);}
}

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

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

相关文章

设计模式---工厂模式

工厂模式 具体的需求 看一个披萨的项目&#xff1a;要便于披萨种类的扩展&#xff0c;要便于维护 披萨的种类很多&#xff08;比如 GreekPizz、CheesePizz 等&#xff09; 披萨的制作有 prepare、bake、cut、box 完成披萨店订购功能 public abstract class Pizza {protect…

浅谈设计模式

状态模式 核心思想就是用于解决一个物体在不同状态下复杂的逻辑行为&#xff0c;比如一个英雄有待机状态&#xff0c;行走状态&#xff0c;攻击状态&#xff0c;以后可能还会添加眩晕状态&#xff0c;冰冻状态一系列状态。 如果使用平常代码来写的话&#xff0c;就会使用分支语…

青椒开计算机课,不断学习 砥砺前行——揭开青椒成长的秘密

从上海到梧州&#xff0c;1700多公里&#xff1b;从2017年9月到今天&#xff0c;300多个日子。我们在互联网结缘&#xff0c;我们在互加遇见。于是&#xff0c;便开始了一路美丽的相伴&#xff0c;相伴在“互加”&#xff0c;相伴在“青椒”&#xff0c;相伴在“美丽乡村”………

了解计算机软件系统教学设计,认识计算机》教学设计

认识计算机》教学设计 作为一名教职工&#xff0c;就有可能用到教学设计&#xff0c;教学设计一般包括教学目标、教学重难点、教学方法、教学步骤与时间分配等环节。那么什么样的教学设计才是好的呢&#xff1f;以下是小编整理的认识计算机》教学设计&#xff0c;仅供参考&…

Java 设计模式——组合模式

概述 有时我们可能会被要求处理一个层级结构明显的对象&#xff0c;比如上下级的公司员工、比如层级嵌套的文件夹&#xff0c;还有丰富多彩的美食菜单。可是&#xff0c;我们可能要屡试不爽地编写深度搜索代码、要小心翼翼地编写递归逻辑。现在你可以忘掉这些&#xff0c;学习…

设计模式之模板方法模式

概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&#…

matlab 滤波器设计工具,滤波器设计工具快速入门

滤波器设计工具快速入门 要打开滤波器设计工具,请键入 filterDesigner(在 MATLAB 命令提示符下键入。) 将打开滤波器设计工具并显示“设计滤波器”面板。 请注意,当您打开设计滤波器并未启用。您必须对默认滤波器设计进行更改以启用设计滤波器。每次您要更改滤波器设计时,均…

ChatGPT有用到知识图谱吗?| 文末送最新《知识图谱实战》书籍

文末留言点赞前五名送书&#xff0c;截止时间2023.4.2(本周日) 20:00 进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群) 从搜索引擎到个人助手&#xff0c;我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常&#xff0c;知识可以隐式…

ChatGPT的诞生

这就是为什么ChatGPT 不可能在中国出现的原因 自欺欺人在家里玩可以&#xff0c;但是 你只是这世界的1/6而已&#xff0c;不可能 欺骗其他5/6的人类 最后还是自己傻比了

51 种 AI 工具,生活、编程、内容创建都应该使用它

AI 正在席卷全球 &#x1f525;&#x1f525;&#x1f525; 它具有无限的潜力&#xff0c;并将改变我们的生活&#xff0c;让生活变得更美好。这项技术将迅速改进&#xff0c;您今天可以使用许多工具来提高您的工作效率&#xff0c;帮助您完成工作&#xff0c;为您提供有关许多…

SpringBoot+Vue+Uniapp搭建的Java版本的ChatGPT智能Ai对话系统

chatgpt-java-system 介绍 SpringBootVueUniapp搭建的Java版本的ChatGPT智能Ai对话系统&#xff0c;小程序和H5包含智能Ai对话、精美Ai壁纸、知识付费商城、积分、会员、分享等公功能&#xff1b;后端管理包括系统管理、智能对话、基本设置、系统监控、代码生成、壁纸管理和商…

chatgpt赋能python:Python解决找零问题--极简演示

Python解决找零问题 – 极简演示 在日常生活中&#xff0c;我们经常需要进行找零计算。如果使用笔和纸来手动计算&#xff0c;则会浪费很多时间和精力。但是Python作为一种高级编程语言&#xff0c;可以轻松地解决这个问题&#xff0c;省去人工计算的烦恼。 什么是Python找零…

九龙证券|远离资本市场噪音的四种方法

我们都知道人是自我完成的群体&#xff0c;自我完成便是便是有方案有目的辅导自己的行为&#xff0c;目标或预期在很大程度上决定着人们的取得感&#xff0c;就好像以下公式所表现的相同&#xff1a;取得感所得/预期&#xff0c;那么股市中的预期是什么&#xff1f;怎么进行预期…

Redis漏洞导致ChatGPT重大故障,OpenAI公布技术细节

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

ChatGPT4 给出数据库开发者最容易犯的10个错误和解决方案

昨天 ChatGPT4 刚刚发布&#xff0c;迫不及待体验了一把。 ChatGPT 4 目前是付费使用&#xff0c;使用次数也有限制&#xff0c;门槛更高&#xff0c;API 调用费用是ChatGPT 3.5 的15倍&#xff0c;官网网站也经常登录不上。 我让 ChatGPT4 列举出【数据库开发者最容易犯的10个…

小白学习chatgpt

很明显&#xff0c;chatgpt的能力超出了人们过往对人工智能的认知&#xff0c;在使用过程中他的能力让我吃惊&#xff0c;而且具有通用性&#xff08;AGI&#xff09;&#xff0c;这一点在以往的人工智能中表现得比较少&#xff0c;具体在GPT-4的早期实验报告中有更多的说明。可…

解密Prompt系列8. 无需训练让LLM支持超长输入:知识库 unlimiformer PCW NBCE

这一章我们聊聊有哪些方案可以不用微调直接让大模型支持超长文本输入&#xff0c;注意这里主要针对无限输入场景。之前在BERT系列中我们就介绍过稀疏注意力和片段递归的一些长文本建模方案长文本建模 BigBird & Longformer & Reformer & Performer&#xff0c;不过…

3DTrans: 首个支持自动驾驶室外点云迁移学习的代码库

本文将为大家介绍上海人工智能实验室交通平台组ADLab的3DTrans代码库–首个自动驾驶室外3D点云迁移学习的代码库。此外3DTrans代码库还是Uni3D&#xff08;CVPR-2023&#xff09;和Bi3D&#xff08;CVPR-2023&#xff09;的官方实现代码库。 Code Link: https://github.com/PJ…

文心一言 VS chatgpt (21)-- h264编码一帧数据的流程是怎样的?

h264编码一帧数据的流程是怎样的&#xff1f; 文心一言&#xff1a; H.264编码将一帧数据分成多个块&#xff0c;其中每个块可以单独进行编码。编码的过程包括预测、变换和量化等步骤。 具体流程如下&#xff1a; 1.帧内预测&#xff1a;对一帧视频进行编码&#xff0c;首先…

chatgpt赋能python:用Python计算AIC:一种常用的信息标准

用Python计算AIC&#xff1a;一种常用的信息标准 介绍 AIC&#xff08;赤池信息准则&#xff09;是一种用于模型选择的信息理论标准&#xff0c;旨在平衡模型复杂度和拟合准确度的权衡。在统计学和机器学习中&#xff0c;模型选择是一项关键任务&#xff0c;因为正确选择模型…