设计模式7——建造者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

建造者模式(Builder)

是一种创建型模式。

目录

一、概述

二、使用步骤

三、Java代码实现


一、概述

1、将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
2、建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

1.1、主要的角色有3种,但从代码(或技术)实现的角度看(为了充分使用面向对象语言的3大特性封装、继承、多态,还另外需要抽象类或接口)有4个:

  • 需要被创建的对象(单个):为了方便起见,我们称它为产品
  • 建造者的抽象类或接口(单个)+ 建造者的实现类(多个):将产品的创建步骤分开,并封装;
  • 指挥官(单个):调用建造者的实现类,完成产品的创建。

 1.2、 直观的理解上这些角色之间的关系如下:

 1.3、通过技术实现的角度看,对象之间关系的UML图如下:

二、使用步骤

  1. 分析产品(有待被创建的对象)在创建的过程中都有哪些步骤;
  2. 将这些步骤封装到建造者类的方法当中;
  3. 然后再创建指挥官类去根据需要调用建造者提供的方法;
  4. 最后,在主程序中需要创建指挥官和对应的建造者实体类,并调用相关的方法去获取产品实例对象。

三、Java代码实现

3.1、对象之间的关系用UML图表示如下:

3.2、Java实现代码如下(建议你在本地试一下,加深印象):

产品类:

public class Product {
    List<String> parts = new LinkedList<>();

    public void add(String part) {
        parts.add(part);
    }

    public void show() {
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

建造者抽象类:

abstract class Builder {
    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract Product getResult();
}

具体的建造者1:

public class ConcreteBuilder1 extends Builder {
    private Product product = null;

    public ConcreteBuilder1() {
        this.product = new Product();
    }

    @Override
    public void buildPartA() {
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        product.add("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

具体的建造者2:

public class ConcreteBuilder2 extends Builder {
    private Product product = null;

    public ConcreteBuilder2() {
        this.product = new Product();
    }

    @Override
    public void buildPartA() {
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        product.add("部件Y");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

指挥官:

public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}

 主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        Director director = new Director();

        //创建第一个产品实例对象
        Builder builder1 = new ConcreteBuilder1();
        director.construct(builder1);
        Product product1 = builder1.getResult();
        product1.show();

        System.out.println("-----");

        //创建第二个产品实例对象
        Builder builder2 = new ConcreteBuilder2();
        director.construct(builder2);
        Product product2 = builder2.getResult();
        product2.show();
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu23.04开机时whoopsie-upload-all占用CPU 100%,风扇狂转

Ubuntu23.04开机时&#xff0c;风扇狂转散热&#xff0c;打开终端&#xff0c;输入top -c&#xff0c;查看占用cpu最高的进程&#xff0c;发现是python3在执行whoopsie-upload-all脚本文件。 什么是whoopsie&#xff1f; 这是“Ubuntu错误报告”守护程序&#xff0c;默认安装在…

FedSyn: Synthetic Data Generation using Federated Learning

arxiv2022&#xff0c;没找到是哪个刊物的&#xff0c;是没投中吗&#xff1f; 这篇是用GAN做数据生成&#xff0c;每个client都训练一个生成器&#xff0c;加噪声传到server端聚合&#xff0c;实验是衡量生成图片的质量。 论文地址&#xff1a;arxiv code&#xff1a;没找到 …

如何在web页面下做自动化测试?

自动化测试是一种通过编写脚本来执行测试用例的方法&#xff0c;可以提高测试效率和准确性。在web页面下进行自动化测试&#xff0c;需要使用适当的工具和技术来实现。 下面将介绍一种从零开始进行web页面自动化测试的方法。 1. 环境准备 首先&#xff0c;需要准备好测试环境…

正确认识IP地址和子网掩码的联系

IP地址和子网掩码是计算机网络中两个非常重要的概念&#xff0c;它们共同确定了设备在局域网中的地址以及该地址所属的子网&#xff0c;只要两者结合&#xff0c;就能确定唯一地址IP66_ip归属地在线查询_免费ip查询_ip精准定位平台。 IP地址是用于标识计算机网络中的每台设备的…

JetLinks物联网平台在windows 7搭建(前后端)部署教程

近期对接TCP、modbusTCP等自定义解析&#xff0c;做了很多万能解析的方法&#xff0c;却都不遂人意&#xff0c;而一直在用的ThingsBoard不能直接对接TCP透传(企业版除外)&#xff0c;需要在外围做一些自定义解析&#xff0c;然后转json再mqtt上传&#xff0c;感觉来说比较麻烦…

Firewalld 防火墙基础

Firewalld概述 Firewalld和iptables的区别 Firewalld网络区域 Firewalld防火墙的配置方法 Firewalld防火墙概述 Firewalld是一个在Linux系统上提供动态管理防火墙功能的工具。 以下是Firewalld的一些主要特点和功能&#xff1a; 动态管理: Firewalld允许在运行时添加、移除…

K8s Service 背后是怎么工作的?

kube-proxy 是 Kubernetes 集群中负责服务发现和负载均衡的组件之一。它是一个网络代理&#xff0c;运行在每个节点上, 用于 service 资源的负载均衡。它有两种模式&#xff1a;iptables 和 ipvs。 iptables iptables 是 Linux 系统中的一个用户空间实用程序&#xff0c;用于…

ipad air6电容笔推荐,2024十大高性价比电容笔排行榜!

​电容笔作为ipad的最佳拍档&#xff0c;为学生党和打工人带来了极大的便利&#xff0c;二者搭配效率真的大大提升&#xff0c;但是&#xff0c;如何选购一支适合自己的电容笔呢&#xff1f;作为一个对数码设备非常感兴趣并且有一定了解的人&#xff0c;我根据自己多年的使用经…

Kafka-偏移量(含消费者事务)

Kafka概述 1.什么是偏移量&#xff1a; 在 Kafka 中&#xff0c;每个分区的消息都会被分配一个唯一的偏移量&#xff08;offset&#xff09;。偏移量简单来说就是消息在分区中的位置标识。 偏移量从 0 开始递增&#xff0c;每条消息的偏移量都会比前一条消息的偏移量大 1。 消…

shell快捷命令与正则表达式

一.高效快捷命令 1.快捷排序——sort 以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 语法格式 sort [选项] 参数 cat file | sort 选项 -n 按照数…

Java操作Word文档,根据模板生成文件

Java操作Word文档 poi-tl介绍 官方文档&#xff1a;https://deepoove.com/poi-tl/ poi-tl&#xff08;poi template language&#xff09;是Word模板引擎&#xff0c;使用模板和数据创建很棒的Word文档。 在文档的任何地方做任何事情&#xff08;Do Anything Anywhere&#…

计算机毕业设计 | node.js(Express)+vue影院售票商城 电影放映购物系统(附源码+论文)

1&#xff0c;绪论 1.1 项目背景 最近几年&#xff0c;我国影院企业发展迅猛&#xff0c;各大电影院不断建设新的院线&#xff0c;每年新投入使用的荧幕数目逐年显著上升。这离不开人们的观影需求及对观影的过程要求的不断进步。广大观影消费者需要知道自己的空闲时间&#x…

冯喜运:5.23黄金市场风云变幻,黄金原油美盘趋势分析

【黄金消息面分析】&#xff1a;在经历了一段时期的强劲上涨后&#xff0c;黄金市场似乎迎来了调整期。北京时间周四(5月23日)&#xff0c;国际黄金价格连续第三个交易日下跌&#xff0c;目前交投在2365美元附近&#xff0c;较周一触及的纪录高点2449.89美元已下跌约4%。这一跌…

使用 ASM 修改字段类型,解决闪退问题

问题 我的问题是什么&#xff1f; 在桥接类 UnityBridgeActivity 中处理不同 unity 版本调用 mUnityPlayer.destroy(); 闪退问题。 闪退日志如&#xff1a; 闪退日志说在 UnityBridgeActivity中找不到类型为 UnityPlayer 的属性 mUnityPlayer。 我们知道&#xff0c;Android…

【webrtc】内置opus解码器的移植

m98 ,不知道是什么版本的opus,之前的交叉编译构建: 【mia】ffmpeg + opus 交叉编译 【mia】ubuntu22.04 : mingw:编译ffmpeg支持opus编解码 看起来是opus是1.3.1 只需要移植libopus和opus的webrtc解码部分即可。 linux构建的windows可运行的opus库 G:\NDDEV\aliply-0.4\C…

同旺科技 FLUKE ADPT 隔离版发布 ---- 2

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B 正面&#xff1a; 反面&#xff1a; 侧面&#xff1a; 开孔位置&#xff08;可…

产品推荐|净气型毒害品柜

SAVEST净气型毒害品柜专为各类危险品、有毒化学品、贵重药品及科研标本等既有严格温湿度控制&#xff0c;又有高度安全保障的物品的存储管理而设计&#xff0c;可广泛应用于各个领域。 净气型毒害品柜产品特点 1. SAVEST净气型毒害品柜由双层钢板构造&#xff0c;两层钢板间隔…

2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 长三角高校数学建模竞赛&#xff08;A题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过…

温故而知新-Java基础篇【面试复习】

温故而知新-Java基础篇【面试复习】 前言版权推荐温故而知新-基础篇【面试】解决hash冲突的方法try catch finallyException与Error的包结构OOM你遇到过哪些情况&#xff0c;SOF你遇到过哪些情况线程有哪些基本状态?Java IO与 NIO的区别堆和栈的区别对象分配规则notify()和not…

安装ollama并部署大模型并测试

Ollama介绍 项目地址&#xff1a;ollama 官网地址&#xff1a; https://ollama.com 模型仓库&#xff1a;https://ollama.com/library API接口&#xff1a;api接口 Ollama 是一个基于 Go 语言开发的简单易用的本地大语言模型运行框架。可以将其类比为 docker&#xff08;同基…