当前位置: 首页 > news >正文

设计模式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();}@Overridepublic void buildPartA() {product.add("部件A");}@Overridepublic void buildPartB() {product.add("部件B");}@Overridepublic Product getResult() {return product;}
}

具体的建造者2:

public class ConcreteBuilder2 extends Builder {private Product product = null;public ConcreteBuilder2() {this.product = new Product();}@Overridepublic void buildPartA() {product.add("部件X");}@Overridepublic void buildPartB() {product.add("部件Y");}@Overridepublic 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可以直接运行。

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

相关文章:

  • 保护共享资源的方法(互斥锁)
  • Spring框架中获取方法参数名称:DefaultParameterNameDiscoverer
  • 开发人员容易被骗的原因有很多,涉及技术、安全意识、社会工程学以及工作环境等方面。以下是一些常见原因:
  • 揭秘指针魔法,让你的编程之旅如虎添翼!‍♂️✨
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(三)
  • 前端 CSS 经典:好看的标题动画
  • 深度学习之基于YOLOV5的口罩检测系统
  • mysql--数据库表的创建及基础命令
  • ACL的几种类型
  • linux:SElinux的实验之自动检查错误并提出解决方案
  • NB49 牛群的秘密通信
  • FFmpeg源码:bytestream_get_byte函数解析
  • linux中sysfs创建设备节点的方法和DEVICE_ATTR
  • Linux安装刻录软件
  • SpringBoot前置知识01-SPI接口
  • [PHP内核探索]PHP中的哈希表
  • 2017-09-12 前端日报
  • HTML中设置input等文本框为不可操作
  • Java 网络编程(2):UDP 的使用
  • javascript 总结(常用工具类的封装)
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Javascript基础之Array数组API
  • MySQL主从复制读写分离及奇怪的问题
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • storm drpc实例
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 动态规划入门(以爬楼梯为例)
  • 分布式事物理论与实践
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端攻城师
  • 区块链技术特点之去中心化特性
  • 收藏好这篇,别再只说“数据劫持”了
  • 双管齐下,VMware的容器新战略
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #微信小程序:微信小程序常见的配置传值
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1) caustics\
  • (1)Nginx简介和安装教程
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2022 CVPR) Unbiased Teacher v2
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二)JAVA使用POI操作excel
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)Google Chrome调试JS
  • . NET自动找可写目录
  • .gitignore文件---让git自动忽略指定文件
  • .NET 5种线程安全集合
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET6 命令行启动及发布单个Exe文件