构建器模式是否会做得太多?

2023-12-26

我最近一直在与一个研究小组一起研究设计模式,并且逐渐了解到构建器模式对于创建由许多(可能是可选的)部分组成的复杂对象非常有用。

然而,建造者是否在某个时刻做得太多了呢?假设我们有一个包含许多不同对象组合的类,是否有另一种模式可能更适合该类,而不是制作数十个不同的构建器?是否可以通过不制作完全特定的构建器来减少所需的构建器数量?

我和我的研究小组不断回顾的例子是汽车制造商,例如汽车公司的网站。任何汽车公司都有数十辆汽车,每辆汽车都有许多不同的功能、颜色、附加功能等。按照我的理解,您的构建器应该特定于您正在制作的确切对象,因此将构建器模式应用于此示例将产生数百个类似于“RedSUVWithSunroofBuilder”、“BlueSUVWithSunroofBuilder”、“RedSUVBuilder”等的构建器。

使用构建器模式时,是否有任何原因无法传递其中一些值来减少需要创建的构建器的数量?例如,代替 RedSUVWithSunroofBuilder 或 BlueSUVWithSunroofBuilder,执行 SUVWithSunroofBuilder("Red") 和 SUVWithSunroofBuilder("Blue") 是否仍然适合构建器模式,或者这更适合不同的模式?


构建器模式当然是任意的,如果它过于复杂,那么它就过于复杂,您可能需要考虑使用不同的方式来创建对象,例如工厂模式 http://en.wikipedia.org/wiki/Factory_pattern。我认为构建器模式在一些场景中表现出色:

  • Creating objects that have several valid configurations
    • 我认为你的汽车就是一个很好的例子
  • Creating immutable objects where not all required data can be supplied up front
    • 对于一个很好的例子,请查看番石榴不可变集合构建器ImmutableSet.Builder http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

以下是如何实施汽车制造商的一个示例:

public class Car {
    private final boolean hasSunroof;
    private final Color color;
    private final int horsePower;
    private final String modelName;

    private Car(Color color, int horsePower, String modelName, boolean hasSunroof) {
        this.color = color;
        this.horsePower = horsePower;
        this.hasSunroof = hasSunroof;
        this.modelName = modelName;
    }

    public static Builder builder(Color color, int horsePower) {
        return new Builder(color, horsePower);
    }

    public static class Builder {
        private final Color color;
        private final int horsePower;
        private boolean hasSunroof;
        private String modelName = "unknown";

        public Builder(Color color, int horsePower) {
            this.color = color;
            this.horsePower = horsePower;
        }

        public Builder withSunroof() {
            hasSunroof = true;
            return this;
        }

        public Builder modelName(String modelName) {
            this.modelName = modelName;
            return this;
        }

        public Car createCar() {
            return new Car(color, horsePower, modelName, hasSunroof);
        }
    }
}

Builder 不一定是嵌套类,但它确实允许您向可能滥用您的 API 的人隐藏您的构造函数。另请注意,所需的最低参数甚至必须提供才能创建构建器。您可以像这样使用这个构建器:

Car car = Car.builder(Color.WHITE, 500).withSunroof().modelName("Mustang").createCar();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建器模式是否会做得太多? 的相关文章

  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • 如何设置TextView的文本?

    我面临将文本设置为的问题TextView在android中我的代码是 public class Main extends Activity Override public void onCreate Bundle savedInstance
  • MatTableDataSource:无法读取未定义的属性“长度”

    我在使用角度材料数据表时遇到以下错误 我可以从 api 获取数据 但无法在视图中呈现它 Error 错误图像 https i stack imgur com CjT7x jpg TS dataSource new MatTableDataS
  • 如何在 .NET 中克隆字典?

    我知道我们应该使用字典而不是哈希表 但我找不到克隆字典的方法 即使我将其转换为 ICollection 来获取 SyncRoot 我知道这也是不受欢迎的 我现在正忙着改变这一点 我是否有正确的假设 即无法以通用方式实现任何类型的克隆 这就是
  • Ruby 中非常便宜的命令行选项解析

    编辑 请 please please在回复之前请阅读本文底部列出的两个要求 人们不断发布他们的新宝石和库等等 这显然不符合要求 有时我想以非常便宜的方式将一些命令行选项修改为一个简单的脚本 一种有趣的方法是 无需处理 getopts 或解析
  • 如何为使用 Vuex 存储的 Vue 表单组件编写 Jest 单元测试?

    我有一个登录表格 当我用数据填写登录表单并单击登录按钮时 表单数据 用户名 密码 被发送到服务器并得到响应 回 如果表单数据无效 则会显示一条消息
  • 在 Rails 中显示两个文本正文之间的差异

    有没有一种简单的方法可以做到这一点 创建标记文本来显示两段文本之间的更改 也许是一个内置的助手 看过但没找到 您可以使用 jsdifflib http snowtide com jsdifflib http snowtide com jsd
  • TabLayout高亮和波纹效果

    我对 TabLayout 有两个问题 1 我可以删除TabLayout突出显示或更改选项卡布局的突出显示颜色吗 2 我可以为选项卡添加涟漪效果吗 每个选项卡都包含 TextView 我尝试添加自定义背景 如下所示
  • 以编程方式更改 Gnome 终端主题

    我想在本地计算机 Ubuntu GNOME 上创建一个设置 终端窗口具有不同的背景颜色 具体取决于我是登录到本地计算机还是通过 ssh 连接到远程计算机 有没有办法做到这一点 这并不能满足您的要求 但它可能会满足您的要求 您可以修改您的 b
  • Material UI v1 - 设置表格列宽

    我想使用 css 在 Material UI 表上设置列宽 而不是在 React 中使用 类 但我不明白如何控制列宽 我尝试设置 TH 列的宽度 但它不起作用 参见示例 Material ui 表示例 https codesandbox i
  • 将 .RData 文件加载到 Python 中

    我有一堆 RData 时间序列文件 希望将它们直接加载到 Python 中 而不需要先将文件转换为其他扩展名 例如 csv 关于实现这一目标的最佳方法有什么想法吗 对于那些不想安装 R 来完成此任务 r2py 需要它 的人来说 作为替代方案
  • 正交投影 Python

    我使用正交投影来绘制地图 我使用这个程序 from mpl toolkits basemap import Basemap import numpy as np import matplotlib pyplot as plt import
  • 在视图模型中实现 IDataErrorInfo

    我有一个 ViewModel 类 其中一个 Phone 对象作为其属性之一 我的主窗口数据上下文设置为 ViewModel 我是否需要在基础 Phone 模型类或包含 Phone 属性的 ViewModel 类上实现 IDataErrorI
  • 设计用户的rails pg db迁移未定义方法“database_authenticatable”

    undefined method database authenticatable for
  • 将屏幕坐标从按钮传递给父级

    我正在为 Android 制作一个钢琴应用程序 作为示例 测试 我的活动中有 4 个按钮 家长是一个Relative Layout我还有一些文本视图可以告诉手指触摸的屏幕坐标 还有一个 textView Entered Button 可以检
  • 无法在 Windows 8 上的 Rails 中通过回形针保存图像

    我使用 回形针 gt 4 1 在 Windows 8 上 将图片保存到我的产品中 我有以下代码 产品控制器 class ProductsController lt ApplicationController before action se
  • Python3 / JS - 如何使用 eel 处理本地文件上传?

    我目前正在开发一个类似 Electron 的本地软件Eel https pypi org project Eel 该软件旨在捆绑为需要在用户本地计算机上运行的独立 Windows 应用程序 在这个软件中 我希望能够在 Python 后端选择
  • 使用 sed 修改 /etc/sudoers

    我正在尝试编写一个 sed 程序来附加Defaults user requiretty行后Defaults requiretty in etc sudoers 我尝试了以下命令 sudo sed i Defaults requiretty
  • Android 中的 Consumer-rules.pro 和 proguard-rules.pro 有什么区别?

    我已经在 Android 中创建了一个模块以在我的主应用程序中使用 并且似乎有两个文件 Consumer rules pro 和 proguard rules pro 我想知道以下事情 所有模块代码是否都会被主模块亲卫规则的规则混淆 即使模
  • iPhone 开发人员:提高 UIWebView 中的滚动速度?

    我有一个应用程序 可以在 UIWebView 中渲染本地 HTML 文件 然而 这些文件有时很大 并且以默认滚动速度到达您想要的位置需要很长时间 有什么方法可以提高 UIWebView 的垂直滚动速度吗 在 iOS 5 中我们可以访问scr
  • 构建器模式是否会做得太多?

    我最近一直在与一个研究小组一起研究设计模式 并且逐渐了解到构建器模式对于创建由许多 可能是可选的 部分组成的复杂对象非常有用 然而 建造者是否在某个时刻做得太多了呢 假设我们有一个包含许多不同对象组合的类 是否有另一种模式可能更适合该类 而