JS设计模式之建造者模式的使用方法详解

 更新时间:2023年08月30日 09:42:20   作者:慕仲卿  
JS建造者模式是一种创建型设计模式,它可以用于构建复杂对象的创建过程,将对象的构建步骤和表示分离,以便能够灵活地构建不同的对象,本文将通过代码示例给大家详细的介绍一下JS建造者模式的用法,需要的朋友可以参考下

定义

一种创建型设计模式,它可以用于构建复杂对象的创建过程,将对象的构建步骤和表示分离,以便能够灵活地构建不同的对象。

参与者

  • 产品(Product):需要被构建的复杂对象。
  • 抽象建造者(Abstract Builder):定义了创建产品对象各个部分的抽象接口。它通常包含一个用于获取最终产品的方法(一般名为 build)。
  • 具体建造者(Concrete Builder):实现了抽象建造者接口,负责具体的产品构建过程。它会定义一系列的构建步骤,并提供方法来获取最终构建完成的产品。
  • 指挥者(Director):负责控制构建过程的顺序和流程。它通过调用具体建造者的方法来构建产品。

优点

  • 分离构建过程和表示,使得构建过程可复用,易于扩展和修改
  • 可以细化构建过程中的每个步骤,灵活控制对象的构建。
  • 隐藏了复杂对象的构建细节,简化了客户端代码。

适用场景

  • 当对象的构建过程具有多个步骤,并且每个步骤都可以有不同的实现方式时。
  • 当需要构建不同表示或配置的对象时,通过调整具体建造者的实现,可以创建不同的产品变体
  • 构建过程独立于对象的主要业务逻辑时,允许更灵活地构建对象。

示例

// 产品类:电脑
class Computer {
  private processor: string;
  private memory: number;
  private storage: number;
  constructor(
    public processor: string,
    public memory: number,
    public storage: number
  ) {}
  public getSpecs(): void {
    console.log(
      `Processor: ${this.processor} | Memory: ${this.memory}GB | Storage: ${this.storage}GB`
    );
  }
}
// 抽象建造者接口
interface ComputerBuilder {
  setProcessor(processor: string): void;
  setMemory(memory: number): void;
  setStorage(storage: number): void;
  build(): Computer;
}
// 具体建造者A
class GamingComputerBuilder implements ComputerBuilder {
  private computer: Computer;
  constructor() {
    // 电脑产品的默认配置为:Intel i7, 16G内存, 512G硬盘
    this.computer = new Computer("Intel i7", 16, 512);
  }
  // 构建处理器类型
  setProcessor(processor: string): void {
    this.computer = new Computer(
      processor,
      this.computer.memory,
      this.computer.storage
    );
  }
  // 构建内存大小
  setMemory(memory: number): void {
    this.computer = new Computer(
      this.computer.processor,
      memory,
      this.computer.storage
    );
  }
  // 构建硬盘大小
  setStorage(storage: number): void {
    this.computer = new Computer(
      this.computer.processor,
      this.computer.memory,
      storage
    );
  }
  // 一个用于获取最终产品的方法
  build(): Computer {
    return this.computer;
  }
}
// 具体建造者B
class OfficeComputerBuilder implements ComputerBuilder {
  private computer: Computer;
  constructor() {
    this.computer = new Computer("Intel i5", 8, 256);
  }
  setProcessor(processor: string): void {
    this.computer = new Computer(
      processor,
      this.computer.memory,
      this.computer.storage
    );
  }
  setMemory(memory: number): void {
    this.computer = new Computer(
      this.computer.processor,
      memory,
      this.computer.storage
    );
  }
  setStorage(storage: number): void {
    this.computer = new Computer(
      this.computer.processor,
      this.computer.memory,
      storage
    );
  }
  build(): Computer {
    return this.computer;
  }
}
// 指挥者
class ComputerDirector {
  private builder: ComputerBuilder;
  constructor(builder: ComputerBuilder) {
    this.builder = builder;
  }
  constructComputer(): Computer {
    this.builder.setProcessor("Intel i7");
    this.builder.setMemory(16);
    this.builder.setStorage(512);
    return this.builder.build();
  }
}
// 客户端代码
const gamingBuilder: ComputerBuilder = new GamingComputerBuilder();
const officeBuilder: ComputerBuilder = new OfficeComputerBuilder();
const gamingDirector: ComputerDirector = new ComputerDirector(gamingBuilder);
const gamingComputer: Computer = gamingDirector.constructComputer();
gamingComputer.getSpecs(); // 输出:Processor: Intel i7, Memory: 16GB, Storage: 512GB
const officeDirector: ComputerDirector = new ComputerDirector(officeBuilder);
const officeComputer: Computer = officeDirector.constructComputer();
officeComputer.getSpecs(); // 输出:Processor: Intel i5, Memory: 8GB, Storage: 256GB

应用场景:

  • XMLHttpRequest(XHR)对象的构建:
    • XHR 是浏览器提供的用于进行 Ajax 请求的对象。
    • 使用建造者设计模式,可以通过设置不同的属性和方法来构建不同类型的 XHR 对象。
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data"); // 构建url和method
xhr.setRequestHeader("Content-Type", "application/json"); // 构建请求头
xhr.onreadystatechange = function () {
  // 构建回调
  if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
    console.log(xhr.responseText);
  }
};
xhr.send(); // 构建请求体
  • DOM 元素的创建:
    • 在 JavaScript 中,我们可以使用 document.createElement() 方法来创建 DOM 元素。
    • 使用建造者设计模式,可以按照特定的顺序设置元素的属性、样式和子元素,然后将其添加到文档中。
// 不算是严格意义上的构建者设计模式
const div = document.createElement("div"); // 注意这里也使用了解释器设计模式
div.classList.add("container");
div.style.setProperty("width", "300px");
div.style.setProperty("height", "200px");
const heading = document.createElement("h1");
div.appendChild(heading);
document.body.appendChild(div);

到此这篇关于JS设计模式之建造者模式的使用方法详解的文章就介绍到这了,更多相关JS建造者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js中document.getElementByid、document.all和document.layers区分介绍

    js中document.getElementByid、document.all和document.layers区分介绍

    document.getElementById 是公共标准,被目前的所有主流浏览器支持,document.all只有IE支持,document.layers是Netscape 4.x专有的属性
    2011-12-12
  • 微信小程序实现车牌键盘

    微信小程序实现车牌键盘

    这篇文章主要为大家详细介绍了微信小程序实现车牌键盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • document.write的几点使用心得

    document.write的几点使用心得

    一直用document.write()方法向浏览器中显示数据用,把它当做Alert()使用, 看来这样用有些大材小用了,下面说说它的主要用处。
    2014-05-05
  • 聊聊Javascript中try catch的2个作用

    聊聊Javascript中try catch的2个作用

    try...catch 可以测试代码中的错误,try 部分包含需要运行的代码,而catch部分包含错误发生时运行的代码,这篇文章主要给大家介绍了关于Javascript中try catch的2个作用,需要的朋友可以参考下
    2021-09-09
  • javascript每日必学之运算符

    javascript每日必学之运算符

    javascript每日必学之运算符,javscript的逻辑中的正序,分支,循环以及一些简单的运算符,想要成为javascript大神的朋友不要错过,阅读一下
    2016-02-02
  • js+canvas绘制矩形的方法

    js+canvas绘制矩形的方法

    这篇文章主要介绍了js+canvas绘制矩形的方法,涉及JavaScript调用html5的canvas组件绘制图形的相关技巧,需要的朋友可以参考下
    2016-01-01
  • js实现的在本地预览图片功能示例

    js实现的在本地预览图片功能示例

    这篇文章主要介绍了js实现的在本地预览图片功能,结合实例形式分析了JavaScript兼容移动web与IE浏览器的图片预览功能相关实现技巧,需要的朋友可以参考下
    2019-11-11
  • js仿微博实现统计字符和本地存储功能

    js仿微博实现统计字符和本地存储功能

    这篇文章主要介绍了js仿微博实现统计字符和本地存储功能的相关资料,需要的朋友可以参考下
    2015-12-12
  • 解决layer 动态加载select 失效的问题

    解决layer 动态加载select 失效的问题

    今天小编就为大家分享一篇解决layer 动态加载select 失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 一个兼容FF的智能超长文章分页JS

    一个兼容FF的智能超长文章分页JS

    这篇文章主要介绍了一个兼容FF的智能超长文章分页JS的相关资料,需要的朋友可以参考下
    2007-07-07

最新评论