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

2023-11-06

为什么要有建造者模式

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。
建造者模式与工厂模式的区别:
工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
在这里插入图片描述

建造者模式

介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。 2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

建造者模式就是要造东西嘛,造点啥呢?
那我们新建一个人的类。

public class Human {
	private String head;
	private String body;
	private String hand;
	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 getHand() {
		return hand;
	}
	public void setHand(String hand) {
		this.hand = hand;
	}
	public String getFoot() {
		return foot;
	}
	public void setFoot(String foot) {
		this.foot = foot;
	}
}

这个就是人的类了,我们取名为human。只要是人都是这个类出来的。

那我们想要造人的话,得有一个标准吧? 来要造人的话得有一个步骤吧?头,身体,手,脚,那都得有。

所以我们先写一个接口。一个定义了造人标准的接口。


public interface IBuildHuman {
	public void buildHead();
	public void buildBody();
	public void buildHand();
	public void buildFoot();
	public Human createHuman();
}

看,一个接口定义好了。有各种造部位的方法,最后给个createHuman方法给你返回一个我们想要造的人。

现在,人的类和造人的标准我们都定义好了。那我们可以先造一个人出来,先造一个高智商的人吧。

public class SmartManBuilder implements IBuildHuman {
	
	Human human;
	
	public SmartManBuilder(){
		human = new Human();
	}
 
	@Override
	public void buildHead() {
		human.setHead("智商180的头脑");		
	}
 
	@Override
	public void buildBody() {
		human.setBody("新的身体");
		
	}
 
	@Override
	public void buildHand() {
		human.setHand("新的手");		
	}
 
	@Override
	public void buildFoot() {
		human.setFoot("新的脚");
		
	}
 
	@Override
	public Human createHuman() {
		return human;
	}
    
}

这个高智商的造人过程自然是实现了IBuildHuman这个造人标准的接口了。然后就是set方法,最后返回造好的human。

好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。接下来,就是介绍建造者模式的精髓,那就是director。这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码:

public class Director {
	public Human createHumanByDirecotr(IBuildHuman bh){
		bh.buildBody();
		bh.buildFoot();
		bh.buildHand();
		bh.buildHead();
		return bh.createHuman();
	}
}

这个director类呢,重点在于createHumanByDirecotr的参数是我们的造人标准的接口。这样一来,只要是实现了我们的这个接口的类,就都可以作为参数,我们刚刚不是造了一个高智商的人吗?那我们如果想造一个身体运动能力出色的人,也就是运动员,这个director也可以启动这个造人过程,只要我们把这个运动员的类先写好。我们来看看director是如何发挥的:


public class BuilderTest {
	public static void main(String[] args){
		Director director = new Director();
		Human human = director.createHumanByDirecotr(new SmartManBuilder());
		System.out.println(human.getHead());
		System.out.println(human.getBody());
		System.out.println(human.getHand());
		System.out.println(human.getFoot());
	} 
}

建造者模式就是这样。那到最后,我们必须要思考一下为什么这么做?学而不思则罔,我们纵观全部代码,其实我们就会发现,在最后的BuilderTest类中,我们其实根本就不会知道具体是怎么造人的,因为这个过程让director给代劳了。然后,我们的SmartManBuilder类中才是真正的造人方法。director其实只是执行了这个过程。这样子,达到了分离模块的功能。造人的过程,启动造人的过程,和最后选择哪种人来造。都分的清清楚楚。就有了一些模块化的感觉,这样维护和扩展都是很方便的。所以设计模式的精髓还是那几个原则。感觉原则才是法则,而这么多模式就是具体的招式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式——建造者模式 的相关文章

  • 记一次spring循环依赖

    问题 spring循环依赖 场景 A注入B B注入A 按理来说spring是支持的处理 不会出现循环依赖的问题 但是 除了相互注入外 项目还是使用的AOP切面打印日志 使用了代理 问题就是出现在这里 源码 Whether to resort
  • 简单的整理一下Vue3的组合API

    1 Vue3的生态和优势 社区生态 逐步完善 整体优化 性能优化 TS支持优化 组合式API加持 市场使用 部分技术选型激进的公司已经在生产环境使用了vue3 社区生态 组件 插件 名称 官方地址 简介 ant design vue Ant
  • Eclipse远程调式

    JVM调式选项 Xdebug Xrunjdwp transport dt socket address 8000 server y suspend y 请务必写在一行
  • matplotlib画图

    画出第一个基本图像 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 50 y x 2 1 plt plot x y plt show 用两个窗口画出两
  • java 算法结构----单链表

    相关基础知识补充 指针 表示一个数据元素逻辑意义上的存储位置 Java语言用通过对象的引用来表示指针 通过把新创建对象赋值给一个对象引用 即是让该对象引用表示 或指向 了所创建的对象 链式存储结构是基于指针实现的 我们把一个数据元素和一个指

随机推荐

  • 3分钟教你子网划分--(内含习题讲解)

    文章目录 一 IPV4 1 IP地址 2 IPV4地址组成 3 IP地址分类 二 子网掩码 1 网络地址与广播地址 2 子网划分 一 IPV4 1 IP地址 IP地址分为IPV4和IPV6 但现在目前大家所常用的为IPV4 IPV4是由32
  • GPU基数排序(CUDA radix sort)

    GPU基数排序 CUDA radix sort 引言 基数排序是具有固定迭代次数的排序算法 其通过对最低位到最高位的一一比较 对数值排序 本文将介绍基数排序的并行实现方法 主要包括并行基数排序 并行合并 并行归约这三种算法 本文全部代码连接
  • CentOS7.x 安装 openssh8.4、openssl1.1.1

    1 升级准备工作 1 1 查看系统版本和ssh版本 cat etc redhat release ssh V 1 2 需要将openssh升级到最新版本 直接yum安装即可 yum install openssh y 可以看已经升级到7 4
  • GCC+makefile+GDB工具

    GCC编译器 以c文件main c sub c和add c和头文件my fun h为例 代码为 1 main c include
  • 西门子200系列PLC学习课程大纲(课程筹备中)

    西门子200系列PLC学习课程大纲如下表所示 共106课 关注我 让你从菜鸟变大神 第1课 西门子200PLC概述 S7 200 PLC新特性是什么 第2课 S7 200 PLC的CPU模块介绍 第3课 S7 200 PLC编程软件介绍 第
  • jquery 访问手机摄像头_jQuery webcam plugin调用摄像头

    简介 原来做项目遇到了调用摄像头功能 php小白遇到这情况立刻就去网上搜索 最后用的 https www helloweba com vie 太烂了 作者也没说如何去使用 如果用的是框架开发更是很麻烦 今天再次发现一款比较灵活的插件jQue
  • qt帮助文档的查看(入门)

    qt帮助文档介绍
  • 语音编码之压缩

    我的书 购买链接 京东购买链接 淘宝购买链接 当当购买链接 这本书里叙述了SILK和Opus语音编解码器 这里简单的串接编解码的核心知识点 LPC LPC Linear predictive coding 在音频和语音处理领域常用于表示压缩
  • Python使用open读取文件时,如何不带换行符(\n)

    在读入一些用文本文档存储的数据时 一般都会在每一行存储一个数据 当我们用python自带的open和readlines读取每行的数据时 是会将每一行结尾的换行符 n 读入的 如下 test text txt内容 dataA dataB da
  • R语言 决策树--预测模型

    决策树 算法的目标是建立分类预测模型或回归预测模型 是一种预测模型 按目标不同可以细分为分类树和回归树 因为在展示的时候 类似于一棵倒置的树而得名 如下图 基本概念 根节点 如上图中最上方 一棵决策树只有一个根节点 中间节点 位于中间的节点
  • 找不到msvcp140.dll无法继续执行代码是什么原因?如何修复呢?

    想和大家分享一个常见的问题 找不到msvcp140 dll无法继续执行代码是什么原因 这个问题可能会让你感到困惑和烦恼 但是请放心 我会提供5个修复方法 并在最后告诉你修复完成以后需要注意的事项 找不到 msvcp140 dll 无法继续执
  • SylixOS系统如何永久修改IP地址

    1 进入 etc目录 找到startup sh文件 通过FTP下载该文件 2 用vs打开startup sh文件 将IP配置信息写入文件 保存 退出 我修改的是en2网口的IP地址 3 将修改后的startup sh文件通过FTP重新传输到
  • scrapy框架讲解

    简介 Scrapy是一个基于Python的开源异步爬虫框架 它被广泛用于从网页或App中 提取数据并将其保存到本地或数据库 由2 8版本以后提供了 http2 0协议的爬虫支持 扩展 scrapy是基于twisted框架开发而来 twist
  • C语言实现二叉树--->二叉查找树

    声明 代码实现都是自己写的 而且没有借鉴别人的代码 也没有看任何教程 只看了下二叉树的具体定义 知道大概是个什么东西 说这些只是为了说明下列代码实现肯定不是最优的 甚至在你们看来都是很垃圾的代码 不过没关系 因为这是我自己动脑筋写出来的 记
  • cmd /c /k

    cmd c dir 是执行完dir命令后关闭命令窗口 cmd k dir 是执行完dir命令后不关闭命令窗口 cmd c start dir 会打开一个新窗口后执行dir指令 原窗口会关闭 cmd k start dir 会打开一个新窗口后
  • 【串口屏】迪文的串口屏下载程序SD卡如何格式化

    用SD卡下载程序到迪文的串口屏需要先将SD卡格式化 而直接鼠标右键快速格式化这种方式不行 必须通过字符命令行格式化才行 即运行 cmd命令 具体如下 SD卡需要格式化成屏能识别的格式 开始 运行 输入cmd进入DOS系统 输入format
  • (二)vue.js的设计模式

    概述 Vue js在设计上采用mvvm模式进行设计 mvvm模式刚出来时一度的被人奉为神一般的模式 好像不懂mvvm模式就脱离了时代一样 什么是mvvm模式呢 Mvvm的全称为 Model View ViewModel m表示数据模型层 v
  • JavaScript 导出CSV文件

    列标题 逗号隔开 每一个逗号就是隔开一个单元格 var str 项目名称 项目信息 n for let i 0 i lt checkedItems length i var data checkedItems i str data Item
  • mysqlbackup企业版物理备份工具使用

    MySQL Enterprise Backup 简称MEB MEB8 对应的是MySQL8 0版本 8 0 28 备份工具的版本和MySQL版本要一致 MEB8 新特性 参考链接 https dev mysql com doc mysql
  • Java设计模式——建造者模式

    文章目录 为什么要有建造者模式 建造者模式 为什么要有建造者模式 工厂类模式提供的是创建单个类的模式 而建造者模式则是将各种产品集中起来进行管理 用来创建复合对象 所谓复合对象就是指某个类具有不同的属性 建造者模式与工厂模式的区别 工厂模式