Java通俗易懂系列设计模式之建造者模式
作者:JaJian 发布时间:2022-11-01 23:27:24
介绍
今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,如工厂模式和抽象工厂模式。
当Object包含许多属性时,引入了Builder模式来解决Factory和Abstract Factory设计模式的一些问题。
当Object包含许多属性时,Factory和Abstract Factory设计模式存在三个主要问题。
从客户端程序传递到Factory类的参数太多,可能容易出错,因为大多数情况下,参数的类型是相同的,而从客户端来说,很难维护参数的顺序。
一些参数可能是可选的,但在Factory模式中,我们被迫发送所有需要发送为NULL的参数和可选参数。
如果对象很重并且它的创建很复杂,那么所有这些复杂性都将成为Factory类的一部分,令人困惑。
我们可以通过提供具有所需参数的构造函数然后使用不同的setter方法来设置可选参数来解决大量参数的问题。这种方法的问题是,除非明确设置所有属性,否则Object状态将不一致。
Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法,解决了大量可选参数和不一致状态的问题。
意图
将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。
定义
现实世界的例子:
想象一下角色扮演游戏的角色生成器。最简单的选择是让计算机为您创建角色。但是如果你想选择职业,性别,头发颜色等角色细节,那么角色生成将成为一个循序渐进的过程,在所有选择准备就绪时完成。
简单来说:
允许您创建不同风格的对象,同时避免构造函数被污染。当有几种不同的构造函数时很有用。或者在创建对象时涉及很多步骤。
* 说:
构建器模式是对象创建软件设计模式,其目的是找到伸缩构造器反模式的解决方案。
话虽如此,让我补充说一下伸缩构造器反模式是什么。某时某刻,我们都会看到如下构造函数:
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {
}
正如您所看到的,构造函数参数的数量很快就会失控,并且可能很难理解参数的排列。此外,如果您希望将来添加更多选项,此参数列表可能会继续增长。这就被称为"the telescoping constructor anti-pattern"(可伸缩构造器的反模式)。
理智的替代方案是使用Builder模式。
实例
让我们看看如何在java中实现构建器设计模式。
首先,您需要创建一个静态嵌套类,然后将所有参数从外部类复制到Builder类。我们应该遵循命名约定,如果类名是Computer那么构建器类应该命名为ComputerBuilder。
Java Builder类应该有一个公共构造函数,其中包含所有必需的属性作为参数。
Java Builder类应具有设置可选参数的方法,并且应在设置可选属性后返回相同的Builder对象。
最后一步是build()在构建器类中提供一个方法,该方法将返回客户端程序所需的Object。为此,我们需要在Class中使用Builder类作为参数的私有构造函数。
下面是示例构建器模式示例代码,首先,我们有我们想要创造的英雄
public final class Hero {
private final Profession profession;
private final String name;
private final HairType hairType;
private final HairColor hairColor;
private final Armor armor;
private final Weapon weapon;
private Hero(Builder builder) {
this.profession = builder.profession;
this.name = builder.name;
this.hairColor = builder.hairColor;
this.hairType = builder.hairType;
this.weapon = builder.weapon;
this.armor = builder.armor;
}
}
然后我们有了建设者
public static class HeroBuilder {
private final Profession profession;
private final String name;
private HairType hairType;
private HairColor hairColor;
private Armor armor;
private Weapon weapon;
public Builder(Profession profession, String name) {
if (profession == null || name == null) {
throw new IllegalArgumentException("profession and name can not be null");
}
this.profession = profession;
this.name = name;
}
public Builder withHairType(HairType hairType) {
this.hairType = hairType;
return this;
}
public Builder withHairColor(HairColor hairColor) {
this.hairColor = hairColor;
return this;
}
public Builder withArmor(Armor armor) {
this.armor = armor;
return this;
}
public Builder withWeapon(Weapon weapon) {
this.weapon = weapon;
return this;
}
public Hero build() {
return new Hero(this);
}
}
请注意,Hero类只有getter方法,没有公共构造函数。因此,获取Hero对象的唯一方法是通过HeroBuilder类。
然后它可以用作如下,显示如何使用Builder类来获取对象:
Hero mage = new Hero.HeroBuilder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();
使用场景
使用Builder模式时
用于创建复杂对象的算法应该独立于构成对象的部分以及它们如何组装
构造过程必须允许对构造的对象进行不同的表示
JDK中的Builder设计模式示例
Java类中的一些构建器模式示例是;
java.lang.StringBuilder#append()(未同步)
java.lang.StringBuffer#append()(synchronized)
来源:https://www.cnblogs.com/jajian/p/9749138.html
猜你喜欢
- 从现在开始,大家可以跟随着我的脚步来自定义一个属于自己的Spring框架。但是,在学习自定义Spring框架之前,我们得先来回顾一下Spri
- 访问权限符:(1)public:对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中。对于类来说:  
- 本地异步处理,采用事件机制 可以使 代码解耦,更易读。事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者、监听者、事件
- Random类 (java.util) Ran
- 本文实例讲述了C#数据绑定(DataBinding)简单实现方法。分享给大家供大家参考。具体实现方法如下:using System;usin
- 使用ProcessBuilder踩到的坑最近使用ProcessBuilder执行命令,命令内容正确,但始终报错命令实行失败,是因为不熟悉Pr
- Spark_SQL性能调优众所周知,正确的参数配置对提升Spark的使用效率具有极大助力,帮助相关数据开发、分析人员更高效地使用Spark进
- Dubbo作为国内最出名的分布式服务框架,是Java程序员必备必会的框架之一,更是中高级测试面试过程中经常会问的技术,无论你是否用过,你都必
- private string HttpPost(string Url, string postDataStr)
- 前言日常开发中,缓存是解决数据库压力的一种方案,通常用于频繁查询的数据,例如新闻中的热点新闻,本文记录springboot中使用cache缓
- 本文主要介绍了Android 获取屏幕的多种宽高信息的示例代码,分享给大家,具体如下:包含的宽高信息如下图所示:在模拟器上获取到的数据:08
- 前言最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意
- 本文实例讲述了C++编写DLL动态链接库的步骤与实现方法。分享给大家供大家参考,具体如下:在写C++程序时,时常需要将一个class写成DL
- 方法一:<uses-permission android:name="android.permission.WAKE_LOC
- 很多人使用Nacos其实并没有真正的去读过官网,以至于忽视了很多重要的细节,Nacos为我们提供了大量API,但是这些API默认是没有开启认
- Java8对集合提供了一种流式计算的方式,这种风格将要处理的元素集合看 作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如
- 大家都用过QQ,肯定有人好奇QQ滑动删除Item的效果是怎样实现的,其实我们使用Swipemenulistview就可以简单的实
- 在AS中进行NDK开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: &
- 本文实例讲述了android开发之listView组件用法。分享给大家供大家参考,具体如下:关于Android ListView组件中and
- 今年春节晚会没看尽兴,被支付宝集福给添了一段插曲,朋友们都在那数定时间段不停的咻一咻,哇,我咻到一个敬业福,不可能的,哈哈。那么咻一咻功能基