设计模式-建造者模式

设计模式-建造者模式在Java中使用示例 没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离, 阅读详情

设计模式-建造者模式

阔别已久了的博客,我又回来。为什么又好长时间没写了,因为最近产品给我的需求稍微有点多,加上自己给自己加的需求,导致经常早九晚二,没空输出了。最近我司项目加入了多渠道快速打包和热更新(老项目添加新技术真的是困难重重,花费了较长时间),并研究了下 Jenkins 持续集成打包(但是由于公司服务器不给我用,先割了段时间)。

最近在项目中写bug的时候发现,项目中的公共Dialog管理类是这样的:

导致每一次增加一种类型的 Dialog 就要增加一个构造函数来实现,久而久之这个类属性也越来越多,构造参数的种类也越来越多,这个类的初衷是为了封装系统AlterDialog的使用,让一些相同样式的Dialog可以用最简单的样式创建,无奈UI样式随着产品的迭代,越来越多,这种单纯的封装有点让人力不从心了。

本文将介绍一种简单的设计模式「建造者模式」。也许它可以很好的解决生产中类似上述描述的情况。

建造者模式的组成部分

我所理解的设计模式思想,本身就是用于解决重复代码封装的一种思想。是前辈们给我们留下的经验。而「书本中的建造者模式」是下边的下边这样子的:

可以看出设计模式由四部分组成:

  1. Product: 产品类所描述的是我们最终想要的到的结果统称,例如一个封装好的带有多选按钮列表的 Dialog。
  2. Builder: 建造者的接口定义,他定义了建造某种产品类需要的步骤,但不提供实现。
  3. ConcreteBuilder: 建造者的实现类,继承自 Builder 提供一种创建类型的具体步骤,是我们封装的拓展对象,比如项目之前只有双按钮的对话框,现在我们有一种带多选功能的对画框需要创建,我们就可以新建一个 ConcreteBuilder 继承自Builder,来完成对多选框Dialog的创建工作,而无序改动前两者。
  4. Director: Builder 类的创建者,由他来为各种 Builder 来赋值属性,Director隔离了建造者实现类与实际客户端创建,让实际对象的创建只关注于对象的属性。

建造者模式的例子

下面通过一个抽象派的 Dota 英雄创建过程,来看下上述四部分是怎么工作的:

首先定一个 DotaHero 类这个类是我们最终的产品类也就是 Product,他可以理解为一个超类,具体实现决定于建造者如何建造。

public class DotaHero {
    //英雄分类 智力 力量 和 敏捷
    public static final int HERO_INTELLECTUAL = 1;
    public static final int HERO_POWEER = 2;
    public static final int HERO_AGLIE = 3;
    @IntDef(value = {HERO_AGLIE, HERO_POWEER, HERO_INTELLECTUAL})
    public @interface HeroType {
    }
    //英雄属性
    private String heroName;
    private String heroDes;
    private int heroType;
    private HashMap<String, String> heroSkills;

    //施放置顶技能
    public void executeSkill(String key) {
        if (heroSkills.containsKey(key)) {
            System.out.println("施放 " + key + " 技能: " + heroSkills.get(key));
        }
    }
    ..... //省略很多的get set
}

DotaHero 是建造者建造的目标,这里定义的属性和方法是最全的,不同的建造者,通过不同的构建步骤,为属性赋值得到最终的不同英雄。

下面我们来定一个一个抽象的建造者创建类,该类定义了所有建造者需要的属性,实现类可以任意扩展。

public abstract class HeroBuilder {
    //最终建造的对象
    protected DotaHero hero;

    public HeroBuilder() {
        //这里在构造函数中就初始化了对象,其实最好的方法是将其放到build方法中。
        hero = new DotaHero();
    }


    public HeroBuilder setHeroName(String name) {
        hero.setHeroName(name);
        return this;
    }

    public HeroBuilder setHeroDes(String des) {
        hero.setHeroDes(des);
        return this;
    }


    public HeroBuilder addHeroSkill(String keyName, String skill) {
        hero.addHeroSkill(keyName, skill);
        return this;
    }

    //定义了英雄类型的抽象方法,需要子类去实现
    protected abstract HeroBuilder setHeroType();

    public DotaHero build() {
        return hero;
    }
}

接下来我们来定义Dota中的英雄建造者,大家都知道,Dota 中英雄有 智力,敏捷,力量三种,所以我们这里定义三种建造者用来构建者三种类型的英雄。

//智力
public class AglieHeroBuilder extends HeroBuilder {
    @Override
    protected HeroBuilder setHeroType() {
        hero.setHeroType(DotaHero.HERO_AGLIE);
        return this;
    }
}
//敏捷
public class IntellectualHeroBuilder extends HeroBuilder {
    @Override
    protected HeroBuilder setHeroType() {
        hero.setHeroType(DotaHero.HERO_INTELLECTUAL);
        return this;
    }
}
//力量
public class PowerHeroBuilder extends HeroBuilder {
    @Override
    protected HeroBuilder setHeroType() {
        hero.setHeroType(DotaHero.HERO_POWEER);
        return this;
    }
}

上述列举了三种建造者,这里只做了抽象方法的实现,实际生产中,子类可以根据需要拓展独有属性。

完成上述工作后,我们就已经能够使用建造者来创建我们需要的对象了。但建造者模式中推荐我们将实际对象的生产的工作不要暴露给客户端,需要通过创建者(创建建造者的类)来隔离建造者和客户端,这样客户端只需要声明我需要一个什么样的建造者,来创建一个什么样的对象就可以了。这样当以后出现了新的建造者类型的时候,客户端仍旧只需要关注上述两点。

下面我们来看下创建者的定义:

public class Director {

    private HeroBuilder builder;
    //构造函数1 直接在外界定义好某类型的 Builder 传入
    public Director(@NonNull HeroBuilder builder) {
        this.builder = builder;
    }

    public DotaHero getAHero() {
        if (builder != null) {
            return builder.build();
        }
        return null;
    }
}

上述代码暴露的个构造方法来创建建造者。他目前所做的工作就是获取建造者或者根据类型创建建造者,通过getAHero方法来获得一个生产对象。

何时该应用建造者模式

通过上述的例子我们可以很好的理解,第一部分建造者模式的各组成部分的作用以及意义。那么在实际生产过程中我们何时该应用建造者模式呢?

在以下情况下可以使用建造者模式:

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 建造者对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

建造者模式的意义在于,建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

建造者模式的优缺点

建造者模式的优点:

  1. 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

  2. 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。

  3. 增加新的具体建造者无须修改原有类库的代码,创建者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

建造者模式的缺点:

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,会导致具体建造者数量变得很多。

总结

通过上文的叙述相信大家已经知道什么是建造者模式了,我们也清楚了建造者模式定义步骤,但是实际开发中,如果一个产品类,变化的范围仅仅是属性不同或者构造顺序不同,那么一个建造者实现类就可以完成工作,那么我们可以省略后两个角色,也就是说 Builder 的类兼职完成步骤2和步骤3。

学习设计模式,笔者认为最好的学习方法就是应用,本文中列举的例子可能过于简单,离掌握还差的远,下一片文章将会带领大家了解我对我司项目中 Dialog 创建封装的过程,从实践中来理解。

参考链接:

建造者模式

设计模式之婵 第2版

C++设计模式——Builder Pattern建造者模式 建造者模式,又被称为生成器模式,是一种创建型设计模式,它将复杂产品的构建过程分解为一系列简单的步骤,每个步骤由独立的建造者对象负责。建造者模式常用于创建复杂的对象,它避免了直接传递大量参数来构造函数,使得构建过程变得可控,让代码变得灵活和可维护。建造者模式允许开发者按照指定的步骤创建复杂对象,构建过程的细节被封装在具体建造者中,将创建对象的过程和表示对象的过程分离,且同一个构建过程可以使用不同的具体建造者以及不同的顺序来创建不同的表示。 阅读详情

相关推荐

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1445

建造者模式及应用举例

目录 模式名和分类 意图 动机 适用性 结构 参与者 协作 效果 代码实例 已知应用 总结 模式名和分类 builder 创建型模式 意图 将一个...

weixin_38169359的博客 1190

手把手教你用Python 3.11和Node.js 18在Windows 11上搭建Dify开发环境

本文提供了一份详尽的Windows 11本地Dify开发环境搭建指南。文章手把手教你完成从Python 3.11、Node.js 18的安装配置,到PostgreSQL、Redis数据库服务的部署,再到前后端服务的启动与联调的全过程,并包含常见问题排查与效能优化建议,旨在帮助开发者构建一个稳定、可调试的Dify本地开发环境。

fire9的博客 645

建造者模式(实例)

目录建造者模式1、模式结构2、模式实例2.1 应用场景类图2.2 代码实现3、模式分析3.1 优点3.2 缺点3.3 适用场景 建造者模式   建造者模式是一种对象创建型模式,它允许用户只通过复杂对象的类型和内容就可以构建它们,而不需要用户知道内部的具体细节。建造者模式是将一个复杂对象的构建与它的表示进行分离,使得一个相同的构建过程可以创建不同的表示。 1、模式结构 Director:指挥者,用于构造使用Builder接口的对象。 Builder:抽象建造者,定义产品对象的各个部件的抽

qq_44889069的博客 4699

机器学习模型系列:随机森林的原理和示例介绍

让我们总结一下与其他监督式机器学习模型相比,随机森林的优缺点。优点在许多真实数据集上已知能提供高度准确的模型。通过结合多个决策树的预测,可以捕捉数据集中的复杂交互和模式。通过自动选择相关特征,可以有效处理高维数据集。与单个决策树相比,不容易过拟合。自助采样和每个节点的随机特征选择有助于减少过拟合并改善泛化能力。可以处理包括数值和分类特征在内的异构数据类型。可以处理缺失值而不需要填充。提供特征重要性的度量。集成中的树可以并行训练,因为每个决策树可以独立构建。模型的泛化误差具有理论上的界限。

数智笔记 1万+

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 417

设计模式(五)——建造者模式实例

设计模式(五)——建造者模式三、建造者模式实例1、快餐套餐实例快餐套餐一般含有主食、饮料、点心三部分组成,KFC快餐套餐与Mcdonald快餐套餐的生成过程大致都是一样的。每份套餐由主食、饮料、点心三部分组成,当每部分具体的食品可能不同,如主食可能是鸡肉卷、汉堡等,即对象的各组成部分可能因为需求的变化面临剧烈的变化。MealBuilder:快餐套餐的生产步骤的...

weixin_34272308的博客 826

逆变器、转换器、DCDC、继电器等器件的原理和作用

交流电变成直流电的过程:整流==》滤波==》稳压。

m0_61973119的博客 8028

【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解建造者模式的思想,介绍其常见的应用场景,举例说明建造者模式的实现方式

我只管埋头前行,剩下的交给时间。 1万+

OpenCode + Oh My OpenCode:打造你的终极AI编程团队(OpenCode新手入门指南)

本文详细介绍了开源终端AI编程助手 OpenCode 的完整配置教程 🖥️,从安装、AI模型配置到增强插件 Oh My OpenCode 的部署一应俱全。支持 Claude、ChatGPT、Gemini 多模型切换 🤖,还能实现多AI智能体协作开发。步骤清晰适合新手 📝,想在终端用AI写代码的开发者不要错过 ✨

XiaoqiangClub的博客 1万+

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 836

设计模式—建造者模式及实例(BuilderPattern)

建造者模式(Builder Pattern)也称生成器模式,它属于创建型模式。

小嵩的博客 4002

如何使用Github创建一个完全免费的个人网站

摘要: 本文详细介绍如何利用Github Pages免费搭建个人静态网站,适合零基础用户。首先需注册Github账号并创建特定命名的仓库(格式:用户名.github.io),然后通过网页或命令行创建index.html文件作为网站首页。完成后可通过"仓库设置- Pages"获取网站链接。文章还包含GitHub Desktop的安装使用、代码提交指南及常见问题自检方法,并说明即使Github被墙也可迁移至国内平台(如码云)。整个过程无需编程基础,仅需15分钟即可完成基础网站搭建。

安德洛夫 1514

【设计模式】Java 设计模式之建造者模式(Builder Pattern)

建造者模式是一种强大的设计模式,它通过抽象化对象的构建过程,提高了代码的可读性、可维护性和可扩展性。该模式适用于需要创建复杂对象且创建过程需要灵活调整的场景。通过定义建造者接口和指挥者类,我们可以将对象的构建逻辑与使用逻辑分离,使得代码更加清晰和易于维护。此外,建造者模式还支持创建多种表示的产品,增强了系统的灵活性。在实际应用中,我们可以根据需求选择合适的建造者模式变种和扩展应用方式,如带有默认值的建造者或链式调用的建造者。未来,随着软件系统的复杂度增加,建造者模式的应用将更加广泛,我们需关注其性能问题和设

新手村长的专栏 4595

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 设计模式——建造者模式(Builder Pattern)

Java 设计模式——建造者模式(Builder Pattern) 一.简介 1.定义 将一个复杂对象的构建与它表示分离,使用同样的构建过程可以创建不同的表示 2.主要作用 在用户不知道对象建造过程和细节的情况下就可以直接创建复杂对象 3.如何使用 用户只需给出指定复杂对象的类型和内容,建造者模式负责按顺序创造对象(把内部建造过程和细节隐藏起来) 4.解决的问题 (1).方便用户创建复杂的对...

a158s168的博客 276

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

23种设计模式之建造者模式(Builder Pattern)

本篇文章将23种设计模式中的建造者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式之建造者模式(Builder Pattern)

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。何时使用:一些基本部件不会变,而其组合经常变化的时候。如何解决:将变与不变分离开。关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

weixin_42294716的博客 1316

彻底搞懂设计模式DesignPattern-建造者模式

基本介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部的具体构建细节。 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 方便用户创建复杂的对象(不需要知道实现过程) 代码复用性 & 封装性(将对象构建过程和细节进

Ping 421

Java设计模式|建造者模式Builder Pattern

Java设计模式|建造者模式Builder Pattern 前言: 在日常生活中,我们可能会遇到这一类型的需求,例如一个实体类里有很多个属性,但是我们只想要其中的几种组合成一个新的对象,这个时候就可以使用建造者模式了,它提供了一种创建对象的最佳方式。建造者模式虽然比较好用,但是大家平时写代码的时候要谨记,不要滥用设计模式,不然的话可能会适得其反啊! 建造者模式 介绍:建造者模式又被称呼为生成器模式,这种类型的设计模式属于创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它

QAQFyl的博客 547

设计模式之建造者模式(BuilderPattern)

一.意义 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 说明:复杂对象的构建,比如一个对象有几十个成员属性,那么我们在创建这个对象,并给成员属性赋值时,就会很麻烦。采用建造者模式,就是把创建对象并给成员属性赋值的工作,分离出来,由建造者角色来完成,业务程序员直接调用导演类,获得复杂对象即可,无需再进行对象的创建工作了。 二.角色 建造者模式涉及到一下几种角色: Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方

敲代码的小小酥的博客 415

Android常见设计模式——建造者模式(Builder Pattern)

文章目录1. 建造者模式2. 建造者模式的简单案例 在23种常见设计模式概述——GoF 23(四人帮,Gang of Four)一文中提到过设计模式可以分为三种类型,分别为 创建型模式 结构型模式 行为型模式 1. 建造者模式 这里介绍的建造者模式(Builder Pattern)属于第一中类型,即创建型模式。 建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 它将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成(像零件的组装过程)。它将

梦否 1330

设计模式——建造者模式(BuilderPattern)

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 UML图:

雪夜&流星的专栏 571

设计模式-03建造者模式Builder Pattern

建造者模式摘要:建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,使构建过程与对象表示分离。该模式适用于需要创建包含多个组成部分的对象,特别是当这些部分可选或构建顺序可变时。通过UML类图展示了经典建造者模式和链式建造者模式的结构差异,并提供了Java实现示例。实现方式包括通过Builder内部类分步骤设置对象属性,最后通过build()方法返回完整对象,使代码更清晰且避免构造器参数过多的问题。

d3y1`5 81_09 1205

设计模式- 建造者模式(Builder Pattern)

定义 建造者模式(Builder Pattern):将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为您创建角色。...

易兒善 474

设计模式:建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。

TechNomad的博客 1019
上一篇: 搞懂设计模式-单例模式
下一篇: 了解面试算法之 - 栈&队列&位运算
Yoda_wang
博客等级 码龄11年 60粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值