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

设计模式(4):建造者模式

一.场景

  • 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理:
    • 装配这些子组件是不是有个步骤问题?
  • 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

二.本质

  • 分离了对象子组件的单独构造(Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就实现了构建算法、装配算法的解耦,实现了更换的复用。

三.举例实现

  • 造一个XX牌飞船,这个飞船有轨道舱、逃逸塔、引擎。那我们应该先造出这些配件,有了这些配件后,再通过组装造出飞船。
  • 代码实现:

    • 飞船和配件类
package hs.builder;
/**
*	对象   XX牌飞船
*/
public class AirShip {private OrbitalModule orbitalModule;//轨道舱private EscpeTower escpeTower;//逃逸塔private Engine engine;  //引擎	/*** 可以构建自己的方法*/public void lunch(){System.out.println("发射。。。。。。。");}public OrbitalModule getOrbitalModule() {return orbitalModule;}public EscpeTower getEscpeTower() {return escpeTower;}public Engine getEngine() {return engine;}public void setOrbitalModule(OrbitalModule orbitalModule) {this.orbitalModule = orbitalModule;}public void setEscpeTower(EscpeTower escpeTower) {this.escpeTower = escpeTower;}public void setEngine(Engine engine) {this.engine = engine;}	
}/**
* 飞船的轨道舱 对象
*/
public class OrbitalModule{private String name;public OrbitalModule() {}public OrbitalModule(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}	
}/**
* 飞船的逃逸塔 对象
*/
public class EscpeTower{private String name;public EscpeTower() {}public EscpeTower(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/**
*  飞船的引擎 对象
*/
public class Engine{private String name;public Engine() {}public Engine(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}	
}
    • 构建飞船组件接口与实现类
/*** 构建 飞船的组件  接口*/
public interface AirShipBuilder {OrbitalModule builderOrbitalModule(); EscpeTower builderEscpeTower();Engine builderEngine();
}
/*** 构建 飞船的组件 对象*/
public class HisAirShipBuilder implements AirShipBuilder {@Overridepublic OrbitalModule builderOrbitalModule() {System.out.println("构建神州牌轨道舱。。。。");return new OrbitalModule("神州牌轨道舱");}@Overridepublic EscpeTower builderEscpeTower() {System.out.println("构建神州牌逃逸塔。。。。");return new EscpeTower("神州牌逃逸塔");}@Overridepublic Engine builderEngine() {System.out.println("构建神州牌引擎。。。。");return new Engine("神州牌引擎");}
}
    • 组装飞船对象接口和实现类
/**
* 组装  飞船对象 接口
*/
public interface AirShipDirector {AirShip directorAirShip();
}
/**
* 组装  飞船对象
*/
public class HisAirShipDirector implements AirShipDirector{private  AirShipBuilder builder;public HisAirShipDirector(AirShipBuilder builder) {this.builder=builder;}@Overridepublic AirShip directorAirShip() {OrbitalModule o=builder.builderOrbitalModule();EscpeTower e=builder.builderEscpeTower();Engine en=builder.builderEngine();//装配成飞船对象AirShip ship=new AirShip();ship.setOrbitalModule(o);ship.setEscpeTower(e);ship.setEngine(en);return ship;}
}
    • 使用者调用
/**
* 建造者模式
*/
public static void main(String[] args) {AirShipDirector director =new HisAirShipDirector(new HisAirShipBuilder());AirShip ship= director.directorAirShip();//可以调用AirShip里构建的方法(AirShip里可以构建各种指令方法)ship.lunch();System.out.println(ship.getOrbitalModule().getName());	
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式持续更新中…

相关文章:

  • 【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心
  • 处理关于 React lazy 白屏的两种方案
  • Linux和Windows安装PHP依赖管理工具Composer
  • 【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。
  • MySQL 优化及故障排查
  • 手机有线投屏到直播姬pc端教程
  • winform日历控件_进度条控件
  • C++面向对象程序设计 - 构造函数
  • Linux——信号概念与信号产生方式
  • U-net在乳腺癌医学图像分割方面的应用
  • vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用
  • 6个黑科技网站,永久免费
  • java中的string和stringbuff和stringBuilter
  • 【学习笔记】java项目—苍穹外卖day03
  • vscode安装
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【面试系列】之二:关于js原型
  • Android Studio:GIT提交项目到远程仓库
  • HTTP请求重发
  • Java 内存分配及垃圾回收机制初探
  • Lucene解析 - 基本概念
  • ng6--错误信息小结(持续更新)
  • Redux系列x:源码分析
  • swift基础之_对象 实例方法 对象方法。
  • ucore操作系统实验笔记 - 重新理解中断
  • 关于使用markdown的方法(引自CSDN教程)
  • 后端_ThinkPHP5
  • 基于游标的分页接口实现
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前嗅ForeSpider中数据浏览界面介绍
  • 从如何停掉 Promise 链说起
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • (07)Hive——窗口函数详解
  • (11)MSP430F5529 定时器B
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (floyd+补集) poj 3275
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)c52学习之旅-简单了解单片机
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (译)2019年前端性能优化清单 — 下篇
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)memcache、redis缓存
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET下ASPX编程的几个小问题
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • [ solr入门 ] - 利用solrJ进行检索
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C puzzle book] types
  • [C#]手把手教你打造Socket的TCP通讯连接(一)