当前位置: 首页 > 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接口
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Centos6.8 使用rpm安装mysql5.7
  • Django 博客开发教程 8 - 博客文章详情页
  • JavaScript服务器推送技术之 WebSocket
  • js算法-归并排序(merge_sort)
  • LeetCode18.四数之和 JavaScript
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • REST架构的思考
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 测试开发系类之接口自动化测试
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 大数据与云计算学习:数据分析(二)
  • 技术胖1-4季视频复习— (看视频笔记)
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端面试题总结
  • 通过git安装npm私有模块
  • 我的面试准备过程--容器(更新中)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ionic异常记录
  • ​低代码平台的核心价值与优势
  • #Linux(Source Insight安装及工程建立)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $nextTick的使用场景介绍
  • (13)Hive调优——动态分区导致的小文件问题
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)c52学习之旅-定时器实验
  • (十八)三元表达式和列表解析
  • (十一)手动添加用户和文件的特殊权限
  • (四)Linux Shell编程——输入输出重定向
  • .md即markdown文件的基本常用编写语法
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net反编译工具
  • .net和jar包windows服务部署
  • .NET基础篇——反射的奥妙