《Java极简设计模式》第04章:建造者模式(Builder)

news2025/1/19 14:32:19

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章汇总:https://binghe.gitcode.host/md/all/all.html
源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/java-simple-design-builder

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:用最简短的篇幅介绍建造者模式最核心的知识,理解建造者模式的设计精髓,并能够灵活运用到实际项目中,编写可维护的代码。

大家好,我是冰河~~

今天给大家介绍《Java极简设计模式》的第04章,建造者模式(Builder),用最简短的篇幅讲述设计模式最核心的知识,好了,开始今天的内容。

一、概述

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二、适用性

1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2.当构造过程必须允许被构造的对象有不同的表示时。

三、参与者

1.Builder 为创建一个Product对象的各个部件指定抽象接口。

2.ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。 定义并明确它所创建的表示。 提供一个检索产品的接口。

3.Director 构造一个使用Builder接口的对象。

4.Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

四、类图

在这里插入图片描述

五、示例

Builder

/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description Person对象的构造接口
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public interface PersonBuilder {

    void buildHead();

    void buildBody();

    void buildFoot();

    Person buildPerson();
}

ConcreteBuilder

/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description Person对象的构造器
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public class ManBuilder implements PersonBuilder{
    Person person;

    public ManBuilder() {
        person = new Man();
    }

    @Override
    public void buildBody() {
        person.setBody("建造男人的身体");
    }

    @Override
    public void buildFoot() {
        person.setFoot("建造男人的脚");
    }

    @Override
    public void buildHead() {
        person.setHead("建造男人的头");
    }

    @Override
    public Person buildPerson() {
        return person;
    }
}

Director

/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description Person对象的整体构造器
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public class PersonDirector {

    public Person constructPerson(PersonBuilder pb) {
        pb.buildHead();
        pb.buildBody();
        pb.buildFoot();
        return pb.buildPerson();
    }
}

Product

/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description Person对象
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public class Person {
    private String head;
    private String body;
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }
}
/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description 创建一个男人类继承Person
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public class Man extends Person{
}

Test

package com.lyz.design.builder;

/**
 * 测试类
 * @author liuyazhuang
 *
 */
public class Test {
	public static void main(String[] args) {
		PersonDirector pd = new PersonDirector();
		Person person = pd.constructPerson(new ManBuilder());
		System.out.println(person.getBody());
		System.out.println(person.getFoot());
		System.out.println(person.getHead());
	}
}

result

/**
 * @author binghe(微信 : hacker_binghe)
 * @version 1.0.0
 * @description 测试类
 * @github https://github.com/binghe001
 * @copyright 公众号: 冰河技术
 */
public class Test {
    public static void main(String[] args) {
        PersonDirector pd = new PersonDirector();
        Person person = pd.constructPerson(new ManBuilder());
        System.out.println(person.getHead());
        System.out.println(person.getBody());
        System.out.println(person.getFoot());
    }
}

好了,今天就到这儿吧,相信大家对建造者模式有了全新的感悟,我是冰河,我们下期见~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

星际争霸之小霸王之小蜜蜂(三)--重构模块

目录 前言 一、为什么要重构模块 二、创建game_functions 三、创建update_screen() 四、修改alien_invasion模块 五、课后思考 总结 前言 前两天我们已经成功创建了窗口,并将小蜜蜂放在窗口的最下方中间位置,本来以为今天将学习控制小蜜蜂,结…

基于IMX6ULLmini的Linux裸机开发系列三:按键检测输入

目录 开启GPIO5对应的时钟 设置引脚复用 设置GPIO5_IO1输入模式 设置检测电平 部分代码 button.c led.c main.c 在原理图上找到对应的引脚后即可以根据对应的图表找到真正在板字上的引脚,这里的 SNVS_TAMPER1对应实际的引脚是GPIO5_IO1 P1357页附近有GPIO5对…

华为OD机试 - 数字字符串组合倒序 - 正则表达式(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、熟读题意,大概理解为:2、我理解 “-”作为连接符使用时作为字符串的一部分 的意思是:3、解决本题的关键是正则表达式的使用。 五、Java算法源码六、效果展示1、输入2、输出…

142页大型制造企业IT蓝图、信息化系统技术架构规划与实施方案PPT

导读:原文《142页大型制造企业IT蓝图、信息化系统技术架构规划与实施方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取…

新能源电动车充电桩控制主板的三大保护功能

新能源电动车充电桩控制主板的三大保护功能 你是否曾经遇到过电动车充电时电流过大,电压不稳定,或者电池过热的情况?这些问题都可能会给你的电动车带来安全隐患。那么,如何避免这些问题的发生呢?让我们一起来探讨一下充电桩控制主板的保护功…

这款编程语言,竟然没有程序员使用,却人丁兴旺

人丁兴旺 现在,编程语言种类繁多,比如Java、Python、C等,每种语言都有其特定的应用场景和优势。 然而,让我们感到惊奇的是,有一款编程语言,它并没有广大的程序员使用,却依然能够在编程世界中独…

初阶C语言-结构体

🌞 “少年有梦不至于心动,更要付诸行动。” 今天我们一起学习一下结构体的相关内容! 结构体 🎈1.结构体的声明1.1结构的基础知识1.2结构的声明1.3结构成员的类型1.4结构体变量的定义和初始化 🎈2.结构体成员的访问2.1结…

04-微信小程序常用组件-基础组件

04-微信小程序常用组件-基础组件 文章目录 基础内容icon 图标案例代码 text 文本案例代码 progress 进度条案例代码 微信小程序包含了六大组件: 视图容器、 基础内容、 导航、 表单、 互动和 导航。这些组件可以通过WXML和WXSS进行布局和样式设置&#xff0c…

我还不知道?Android组件化插件化模块化

Android组件化、插件化和模块化是针对Android应用程序开发的一种架构设计思想和开发方式。 组件化(Componentization): 组件化是将一个大型的Android应用程序拆分成多个独立的组件(Module),每个组件可以独…

SUMO 创建带有停车位的充电站 在停车位上充电

前言 SUMO提供的Charging Station是没有停车位的,车辆只有在通过充电站区域或者停在充电站区域内时才能被充电,这时充电的车辆就会占用道路。然而,真实世界中的情况通常是充电站设在路边,且提供一定量的车位用于停车,…

探索OLED透明屏的多领域应用:技术驱动的未来之窗

OLED透明屏作为一项具有突破性技术的新兴产品,正在各个领域展现无限的可能性。 其独特的透明性和高对比度,使其在智能家居、汽车行业、商业展示、航空航天、教育与培训以及医疗健康等领域中得到广泛应用。 那么,尼伽将详细探讨OLED透明屏在…

程序的DAC检查与LSM简介

程序的DAC检查 在Linux中,程序的DAC(Discretionary Access Control,自主访问控制)检查是指操作系统对程序执行期间对文件和资源的访问权限进行的检查。 Linux使用一种基于权限的访问控制模型,其中每个文件和资源都与…

Linux学习之iptables过滤规则的使用

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810,uname -r看到内核版本是3.10.0-957.el7.x86_64,iptables --version可以看到iptables版本是v1.4.21。 iptables -t filter -A INPUT -s 10.0.0.8 -j ACCEPT会在最后一行插入。 10…

借用空数组方法:处理类数组的对象的实用技巧

前言 NodeList 不是一个数组,是一个类似数组的对象 (Like Array Object)。虽然 NodeList 不是一个数组,但是可以使用 forEach() 来迭代。你还可以使用 Array.from() 将其转换为数组。 不过,有些浏览器较为过时,没有实现 NodeList.…

C++项目实战之演讲比赛流程管理系统

演讲比赛流程管理系统 1. 演讲比赛程序需求 1.1 比赛规则 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛 每名选手都有对应的编号,如 10001 ~ 10012 比赛方式:分组比赛&#xff0…

git提交代码是用git-merge还是git-rebase呢?

什么是git merge? git merge是我们在git操作中频繁会用到的一个命令,它主要实现的功能便是为我们进行分支代码的合并,也就是将两个或两个以上的开发历史合并在一起的操作。 它有以下两种用途: 更新代码时,整合另一个…

行业资讯丨“燃气智慧化”到底是什么?

文章来源:网络 关键词:智慧燃气、智慧燃气场站、设备设施数字化、数字孪生、工业互联网 带你了解燃气信息化 随着科技的不断进步和信息化的快速发展,各行各业都在积极探索如何将技术应用于业务中,以提高效率和服务质量。 燃气…

Java实现钉钉企业内部应用机器和自定义机器人发送消息

前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…

初试时间官宣!研招网发布下半年重要时间节点!今日速报来了

距24考研初试还有127天,今天给大家带来初试和报名时间官宣消息、考研报名注意事项、研招网发布的2024考研“保姆级”下半年重要时间节点。有用记得收藏 24考研报名和初试时间官宣 已有学校在招生简章中明确24考研初试时间 初试时间预计为:2023年12月23…

当我们都是那个“和尚”:团队合作中的责任与动力

引言:三个和尚的故事 中国的古老民间故事中,有一个被广为传颂的故事 - 三个和尚的故事。该故事描述了三位和尚居住在远离水源的山上寺庙中。当只有一个和尚时,他每天下山提水,日复一日,从未间断。但当寺庙里有了三个和…