设计模式之建造者模式学习笔记

news/2024/11/28 9:09:22/

前言

建造者模式也叫生成器模式,是创建一个复杂对象的创建型模式,将此创建过程和部件解耦,使其构建过程和部件的表示分离开。

解释

建造者模式,说白了就是“攒机”。比方说我想要定制一台笔记本电脑,我要求固态必须是2T容量的三星970evo,内存必须是三星的,屏幕也必须是三星的。这里我们只需要把配置、品牌告知商家就行了,至于这台电脑最后怎么组装那就是他们的事了,跟我没关系。

结构图

在这里插入图片描述角色拆解:
1.Director:导演类,安排已有模块的顺序,通知Builder开始建造。
2.Builder:抽象类,规范产品组建,一般由子类完成
3.ConcreteBuilder:具体建造者,实现抽象Builder类定义的所有方法,并返回一个组建好的对象
4.Product:产品类

举栗实现

1.创建Product产品类

这里的产品很明确了,我就要定制一台暗影精灵。有键盘、屏幕…一堆零部件组成

public class Computer {private String keyboard;//键盘private String screen;//屏幕...public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setScreen(String screen) {this.screen = screen;}...
}

2.Builder类规范产品组建

铁板熊掌普本身有一套严格规范的生产流水线(也可以理解为是说明书),也就是Builder。键盘、屏幕这些零部件拿过去,就能“攒”好。

//惠普的流水线生产规范
public abstract class Builder {public abstract void buildKeyboard(String keyboard);//安装键盘public abstract void buildScreen(String screen);//安装屏幕//这里省略了一大堆诸如安装固态、内存条、CPU的方法...public abstract Computer create();//组装完成,出厂
}

3.具体建造者ConcreteBuilder

淘宝商家接单了,参照着铁板熊掌普的“说明书”,就开始为我组装暗影精灵了!

//淘宝商家一边看说明书,一边组装
public class TaobaoBuilder extends Builder {private Computer computer = new Computer();@Overridepublic void buildKeyboard(String keyboard) {computer.setKeyboard(keyboard);}@Overridepublic void buildScreen(String screen) {computer.setScreen(screen);}@Overridepublic Computer create() {return computer;}
}

4.Director导演类指挥组装

淘宝商家的“导演类”来规范组装暗影精灵的流程,装了键盘再装屏幕,还有主板…最后齐活了。

//导演负责喊开机
public class Director {Builder builder = null;public Director(Builder builder) {this.builder = builder;}public Computer createComputer(String keyboard,String screen){//规范建造流程builder.buildKeyboard(keyboard);builder.buildScreen(screen);return builder.create();//出厂}
}

5.客户端调用

public class UserClient {public static void main(String []args){TaobaoBuilder taobaoBuilder = new TaobaoBuilder();//淘宝商家Director director = new Director(taobaoBuilder);//淘宝商家的导演类对象//导演命令,生产暗影精灵director.createComputer("razer","samsung");}
}

使用场景

1.创建复杂对象的方法,独立于对象内部的组成零件、组成方式
2.相同的方法,不同的执行顺序,产生不同的结果
3.多个零件被安装到对象中,产出结果不同。体现在“攒机”上,没准一会攒一个顶配暗影精灵,一会攒一个乞丐版
4.产品类十分复杂,或者产品类内部的调用顺序不同产生不同的结果
5.创建一个对象,组建流程是稳定的(说明书),但是内部零件组成千变万化

优缺点

优点
1.用户不需要知道组建的细节,只需要提供配置清单即可
2.具体的建造者类之间相互独立,易扩展。惠普说明书就一份,但是淘宝商家成千上万家
3.具体建造者(淘宝商家)是独立的,可以对建造过程逐步细化,不会对其他模块产生影响
缺点
1.产生对于的导演类和Builder对象

最后说一句

建造者模式在Android开发中也是很重要的,在Android源码和一些知名的开源框架内部就能频繁见到它的身影,比如AlertDialog、ImageLoader、Rxjava…还是那句话,优秀的代码离不开算法和设计模式,希望能帮到大家!


http://www.ppmy.cn/news/825720.html

相关文章

Java数据结构与算法05——多图读懂双向链表

标签(空格分隔): Java 数据结构 算法 作者 : Maxchen 版本 : V1.0.0 日期 : 2020/4/27 目录 什么是双向链表?为什么会使用它?双向链表的几个常规操作1、创建链表2、遍历链表3、新…

Java数据结构与算法04——单向链表

标签 : Java 数据结构 算法 作者 : Maxchen 版本 : V1.0.1 日期 : 2020/4/2 目录 1.单向链表——原理2.单向链表——代码实现2.1单向链表——新增与查询2.2单向链表——修改2.3单向链表——删除 3.单向链表——整体代码 1.单向…

Vue3+Vite+Pinia+Naive后台管理系统搭建之六:Axios 网络请求

前言 如果对 vue3 的语法不熟悉的,可以移步Vue3.0 基础入门快速入门。 Axios 详情可移步官网参看:Axios 官网 1. 安装依赖 yarn add axios // or npm install axios 2. .env 环境配置 对环境配置不了解的可移步:Vue 入门系列&#xff1a…

HTML5+CSS3小实例:带进度条的人物卡片切换效果

实例:带进度条的人物卡片切换效果 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

ffmpeg学习 源代码编译、英伟达硬件加速

使用cpu进行软编解码时&#xff0c;cpu效率低并且占用高。使用硬件加速&#xff0c;能够明显降低CPU的占用&#xff0c;参看博客 ffmpeg学习&#xff08;16&#xff09;AVDevice使用。 这里以使用英伟达gpu进行h264编解码加速为例说明&#xff0c;其他平台类似。 1、winodws硬…

英伟达笔试面试题整理DIY

nvidia 不是家喻户晓&#xff0c;但对于搞计算机可视化和图形的人来说应该没人不知道吧。 C/C编程&#xff0c;C#编程&#xff0c;Python 编程&#xff0c;Windows 操作系统知识&#xff0c;Linux 操作系统知识&#xff0c;SQL 语言知识&#xff0c;正则 表达式知识&#xff0…

英伟达jetson硬件(NX,nano,AGX,TX1,TX2)通用开机自动开启风扇教程

英伟达jetson硬件通用的风扇开机自启动教程 1.安装jetson-stats2.重启硬件&#xff0c;然后进入jtop3.操作设置4.重启测试风扇是否自动开启 1.安装jetson-stats &#xff08;先安装一下pip&#xff09; sudo apt-get install python3-pip然后就可以正常使用pip进行安装&#…

英伟达 nvidia jetson AGX xavier 风扇开机自启动设置

1. 风扇开机自启设置 切换到 root 用户 sudo su修改风扇pwm调速文件权限 chmod 777 /sys/devices/pwm-fan/target_pwm修改系统外设配置文件&#xff0c;并添加风扇开机启动任务&#xff1a; vim /lib/systemd/system/rc-local.service注意&#xff1a; 1.如不知道该文件路径…