当前位置: 首页 >  网技达人 >  【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现

【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现

导读:简介.建造者模式(Builder.Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。.当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组

简介

建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。

当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。

作用

  1. 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
  2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  3. 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。

实现步骤

  1. 定义主管类,可以制造所有形式的产品。
  2. 在基本生成器接口中声明创建产品的步骤。
  3. 为每个形式的产品创建具体生成器类,并实现其构造步骤。
  4. 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。

UML

代码

创建建造者接口

// Builder.java 建造者接口,定义基本建造方法
public interface Builder {
  public void reset();
  public void setName(String name);
  public void setScreen(Integer[] screen);
  public void setGPU(Integer no); 
}

具体建造者类,可以多个

// ManualBuilder.java 使用手册建造者类也实现了建造者接口
public class ManualBuilder implements Builder {
  private Manual manual;

  public void reset() {
    this.manual = new Manual();
  }

  public void setName(String name) {
    this.manual.setName(name);
  }

  public void setScreen(Integer[] screen) {
    this.manual.setScreen(screen);
  }

  public void setGPU(Integer no) {
    this.manual.setGpuType(no);
  }

  public Manual getProduct() {
    return this.manual;
  }
}

// PhoneBuilder.java 手机建造者实现了建造者接口
public class PhoneBuilder implements Builder {
  private Phone phone;

  public void reset() {
    this.phone = new Phone();
  }

  public void setName(String name) {
    this.phone.setName(name);
  }

  public void setScreen(Integer[] screen) {
    this.phone.setScreen(screen);
  }

  public void setGPU(Integer no) {
    this.phone.setGpuType(no);
  }

  public Phone getProduct() {
    return this.phone;
  }
}

定义具体产品类,不同建造者建造不同产品

// Manual.java 手册产品类
public class Manual {
  private String name = "PhoneManualName";
  private Integer[] screen = { 0, 0 };
  private Integer gpuType = 0;
  private Integer pages = 0;

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

  public void setScreen(Integer[] screen) {
    this.screen = screen;
  }

  public Integer[] getScreen() {
    return this.screen;
  }
  ......

}

// Phone.java 手机产品类
public class Phone {
  private String name = "PhoneName";
  private Integer[] screen = { 0, 0 };
  private Integer gpuType = 0;

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

  public void setScreen(Integer[] screen) {
    this.screen = screen;
  }

  public Integer[] getScreen() {
    return this.screen;
  }
  ......

}

指挥调度类

// Director.java 指挥调度类,负责利用建造者建造产品,隔离需求与功能
public class Director {

  // 建造phone1
  public void buildIPhone(Builder builder) {
    builder.reset();
    Integer[] screen = { 120, 500 };
    builder.setName("iPhone");
    builder.setScreen(screen);
    builder.setGPU(100);
  }

  // 建造phone2
  public void buildHuaweiPhone(Builder builder) {
    builder.reset();
    Integer[] screen = { 130, 600 };
    builder.setName("HuaweiPhone");
    builder.setScreen(screen);
    builder.setGPU(102);
  }

  // 建造phone3
  public void buildMiPhone(Builder builder) {
    builder.reset();
    Integer[] screen = { 120, 650 };
    builder.setName("MiPhone");
    builder.setScreen(screen);
    builder.setGPU(103);
  }

}

测试调用

    /**
     * 建造者模式是使用多个简单的对象一步一步构建出一个复杂的对象来。
     * 分为主管类和建造这类,主管类负责具体指挥调度,建造负责具体实施。
     * 主管类通过一步一步调用各种建造者实现复杂对象。
     */

    // 声明指挥者
    Director director = new Director();
    // 创建手机
    PhoneBuilder phoneBuilder = new PhoneBuilder();
    director.buildMiPhone(phoneBuilder);
    Phone miPhone = phoneBuilder.getProduct();
    System.out.println("miPhone:" + miPhone.getName() + " | " + miPhone.getGpuType().toString());
    // 创建手册
    ManualBuilder manualBuilder = new ManualBuilder();
    director.buildMiPhone(manualBuilder);
    Manual manual = manualBuilder.getProduct();
    System.out.println("manual:" + manual.getName() + " | " + manual.getGpuType().toString());

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern

内容
  • Docker-Compose部署Gitlab以及Gitlab配置SMTP邮件服务
    Docker-Compose部署
    2023-12-12
    使用Docker-Compose部署Gitlab.拉取镜像.地址: https://hub.docker.com/r/g
  • 代码审计工具Fortify基本使用
    代码审计工具Fortify基本使
    2023-12-11
    最近接触到一款代码审计的工具 — Fortify SCA and Applications 22.2.0,现就其基本使用
  • c++ function使用
    c++ function使用
    2023-12-11
    一、function介绍.funciotn是从c++11开始支持的特性,使用它需要包含头文件.在cppreference
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 2分钟快速上手流水线的创建与运行
    2分钟快速上手流水线的创建与运行
    2023-12-09
    摘要: 通过流水线新手体验模板,体验一条含代码检查、构建阶段、部署发布常用流水线的创建与执行。.本文分享自华为云社区《2
  • gitlab ci 集成 eslint/prettier/tsc 做代码审查,并使用 eslint 输出作为显示代码质量
    gitlab ci 集成 esl
    2023-12-09
    前言.想自动化一下公司里代码的部分审查,最初想用 reviewdog 的,但是公司的域名基本都在 VPN 中访问的,gi
  • CesiumJS 源码杂谈 - 时间与时钟系统
    CesiumJS 源码杂谈 -
    2023-12-08
    目录.1. 时间的“诞生”.2. 时间的推进.3. Entity API 与 Property API 的更新动力源.4
  • 使用unplugin-auto-import自动导入插件优化vite开发vue3应用
    使用unplugin-auto-
    2023-12-06
    为什么要使用unplugin-auto-import插件?.使用vite编写vue3代码时,使用composition
  • misc刷题
    misc刷题
    2023-12-04
    lsb隐写.引用一段百度内容.> LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛
  • C#结合OpenCVSharp4使用直方图算法比较图片相似度
    C#结合OpenCVSharp4
    2023-12-04
    C#结合OpenCVSharp4使用直方图算法比较图片相似度.直方图有灰度直方图、颜色直方图,如果是灰度图像,那么就用灰
  • 【AutoHotkey】一种适合敲代码&&可以用左手完成大部分功能的组合键设计
    【AutoHotkey】一种适合
    2023-12-04
    故事一.使用键盘,需要两只手;.使用鼠标,还需要一只手;.总共三只手。.而你,只有两只手.所以,你需要第三只手(bush
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 1.4 编写简易ShellCode弹窗
    1.4 编写简易ShellCod
    2023-12-02
    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关
  • 互联网金融服务平台
    互联网金融服务平台
    2024-01-10
    互联网金融服务平台.产品功能.个人理财:用户可以通过平台进行投资理财,选择适合自己的理财产品,实现资金增值。.贷款服务:
  • 虚拟现实和增强现实技术产品
    虚拟现实和增强现实技术产品
    2023-12-21
    虚拟现实和增强现实技术产品介绍.产品描述.我们的产品是一款虚拟现实(VR)和增强现实(AR)技术产品,通过使用先进的技术
  • 云计算解决方案
    云计算解决方案
    2023-12-11
    云计算解决方案.产品功能.弹性扩展:根据用户的需求动态扩展计算和存储资源,确保应用在任何时候都有足够的资源支持。.高可用
  • ***硬件
    ***硬件
    2023-12-21
    ***硬件.产品功能.***硬件是一种专门为数据存储和处理而设计的硬件设备。它能够提供稳定可*的存储空间和数据处理能力,
  • 电子元件传感器
    电子元件传感器
    2024-01-15
    电子元件传感器.产品功能.电子元件传感器是一种具有高精度和快速响应的传感器,可用于检测温度、湿度、压力等多种物理量,并将
  • 电子元件半导体器件
    电子元件半导体器件
    2023-12-06
    电子元件半导体器件.产品功能.我们的电子元件半导体器件是一种高性能的电子元件,主要用于在电子设备中实现信号放大、整流、稳
  • ***性能优化服务
    ***性能优化服务
    2023-12-31
    ***性能优化服务.我们的服务器性能优化服务是针对企业和个人用户的***性能提升及优化解决方案。无论您是在使用自己的服务
  • 电子元件连接器
    电子元件连接器
    2023-12-31
    电子元件连接器.产品功能.电子元件连接器是一种用于连接不同电子元件的重要组件。它可以提供可*的电气连接,从而实现各种电子
  • 移动应用开发
    移动应用开发
    2023-12-01
    移动应用开发.产品描述.移动应用开发是一种专注于为移动设备(如智能手机、平板电脑)开发应用程序的技术和流程。这些应用程序
  • 在线教育平台
    在线教育平台
    2023-12-16
    在线教育平台.产品描述.我们的在线教育平台是一个集合了丰富教学资源和互动学习工具的全方位教育平台。通过我们的平台,学生可