首页 web前端 js教程 掌握构建器设计模式:简化复杂对象的创建

掌握构建器设计模式:简化复杂对象的创建

Nov 12, 2024 am 06:28 AM

Mastering the Builder Design Pattern: Simplifying Complex Object Creation

介绍

作为开发人员,我们所有人都遇到过需要创建对象的情况。尝试为此对象设计通用类的问题是它可以采用多种形式。一个简单的例子:平台的 User 类。对于普通用户,我们可能只需要一个电子邮件和一个用户名。但是,对于平台管理员来说,可能需要电话号码等其他属性。我们还可以有一个高级用户,其中需要额外的字段,例如信用卡号等。

那么,我们如何才能以通用的方式进行呢?

面对这个问题,开发者社区商定了一个流行的创建模式:Builder设计模式。此模式涉及将复杂对象的构造与其表示分离,从而允许使用相同的构造过程创建多个对象变体。

此模式对于具有许多属性的对象特别有用,其中一些属性对于某些情况可能是可选的,但对于其他情况则不然,或者对于需要详细初始化过程的对象。它允许灵活、逐步创建对象,而不会使代码过于复杂或构造函数过于重载。

我们将涵盖的部分

  1. 什么是构建器模式?
  2. 什么时候应该使用它?
  3. 构建器使用的真实示例
  4. 为什么这个模式如此重要?
  5. 结论 ## 什么是构建器模式? 构建器设计模式是一种创造性的设计模式,允许控制和灵活地构造复杂对象。构建器没有使用带有大量参数的构造函数,而是提供了一个平滑的接口来逐步创建对象。当对象有很多属性、特定的构建步骤或多种可能的配置时,它非常有用。

什么时候应该使用它?

构建器设计模式在以下情况下特别有用:

  1. 如果一个对象有很多属性,其中一些属性是可选的:回到我们在本文开头提出的问题,让我们考虑 User 类。根据我们描述的逻辑,如果我们实例化这个 User 类,我们可能会遇到不同的情况:对于普通用户,normalUser = new User("houda", "houda@gmail.com", null, null),对于管理员adminUser = new User("houda", "houda@gmail.com", "0657...", null),对于高级用户,premiumUser = new User("houda", "houda@gmail.com",无效的, “1234……”)。这会导致实例化中出现许多空值。

  2. 具有多步骤创建过程的对象:一个示例是 Order 类。第一步是下订单,然后准备,最后交付。准备订单可能需要多个步骤,为了确保正确的构建顺序,构建器设计模式非常有用。

  3. 支持同一对象的多种表示:例如,具有面料、颜色和品牌属性的 Clothing 类。服装可以是裤子、T 恤或其他类型。在这里,构建器模式有助于创建同一基类的不同表示。

构建器使用的真实示例

对于我们之前在本节中看到的每种情况,我们将看到构建器的实现

  1. 如果一个对象有很多属性,其中一些属性是可选的
class User {
    username: string;
    email: string;
    phoneNumber?: string;
    creditCard?: string;

    private constructor(builder: UserBuilder) {
        this.username = builder.username;
        this.email = builder.email;
        this.phoneNumber = builder.phoneNumber;
        this.creditCard = builder.creditCard;
    }

    public static get Builder() {
        return new UserBuilder();
    }
}

class UserBuilder {
    username!: string;
    email!: string;
    phoneNumber?: string;
    creditCard?: string;

    public setUsername(username: string): UserBuilder {
        this.username = username;
        return this;
    }

    public setEmail(email: string): UserBuilder {
        this.email = email;
        return this;
    }

    public setPhoneNumber(phoneNumber: string): UserBuilder {
        this.phoneNumber = phoneNumber;
        return this;
    }

    public setCreditCard(creditCard: string): UserBuilder {
        this.creditCard = creditCard;
        return this;
    }

    public build(): User {
        return new User(this);
    }
}

// Usage
const normalUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .build();

const adminUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .setPhoneNumber("0657....")
    .build();

const premiumUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .setCreditCard("1234....")
    .build();

登录后复制
  1. 具有多步骤创建过程的对象
class Order {
    private state: string;

    private constructor(builder: OrderBuilder) {
        this.state = builder.state;
    }

    public static get Builder() {
        return new OrderBuilder();
    }

    public getState(): string {
        return this.state;
    }
}

class OrderBuilder {
    state: string = "Placed";

    public prepareOrder(): OrderBuilder {
        if (this.state === "Placed") {
            this.state = "Prepared";
        }
        return this;
    }

    public deliverOrder(): OrderBuilder {
        if (this.state === "Prepared") {
            this.state = "Delivered";
        }
        return this;
    }

    public build(): Order {
        return new Order(this);
    }
}

// Usage
const completedOrder = Order.Builder
    .prepareOrder()
    .deliverOrder()
    .build();
console.log(completedOrder.getState()); // "Delivered"

登录后复制
  1. 支持同一对象的多种表示
class Clothing {
    type: string;
    fabric: string;
    color: string;
    brand: string;

    private constructor(builder: ClothingBuilder) {
        this.type = builder.type;
        this.fabric = builder.fabric;
        this.color = builder.color;
        this.brand = builder.brand;
    }

    public static get Builder() {
        return new ClothingBuilder();
    }
}

class ClothingBuilder {
    type!: string;
    fabric!: string;
    color!: string;
    brand!: string;

    public setType(type: string): ClothingBuilder {
        this.type = type;
        return this;
    }

    public setFabric(fabric: string): ClothingBuilder {
        this.fabric = fabric;
        return this;
    }

    public setColor(color: string): ClothingBuilder {
        this.color = color;
        return this;
    }

    public setBrand(brand: string): ClothingBuilder {
        this.brand = brand;
        return this;
    }

    public build(): Clothing {
        return new Clothing(this);
    }
}

// Usage
const tShirt = Clothing.Builder
    .setType("T-Shirt")
    .setFabric("Cotton")
    .setColor("Blue")
    .setBrand("BrandA")
    .build();

const pants = Clothing.Builder
    .setType("Pants")
    .setFabric("Denim")
    .setColor("Black")
    .setBrand("BrandB")
    .build();

登录后复制

为什么这个模式如此重要?

构建器设计模式很重要,有几个关键原因,特别是在管理对象创建的复杂性时。这就是它如此有价值的原因:

  1. 处理复杂对象

当一个对象有很多属性,其中一些属性可能是可选的或需要按特定顺序设置时,构建器模式提供了一种清晰且结构化的方法来创建对象。

  1. 提高代码可读性和可维护性

通过将对象创建逻辑与对象本身分离,构建器模式使代码更具可读性且更易于维护。

  1. 减少构造函数重载

构建器模式不再需要具有不同参数组合的多个构造函数,而是消除了构造函数重载的需要。

  1. 明确分离关注点

构建器将对象的构造与其表示分离。这意味着您可以更改对象的构造方式而不影响其表示,反之亦然。

结论

构建器设计模式是开发人员处理复杂对象创建的必备工具。通过将构建过程分解为清晰、可管理的步骤,它提高了代码的可读性、可维护性和灵活性。无论您正在使用具有许多属性、需要多步骤构造还是需要支持多种配置的对象,构建器模式都提供了一个优雅的解决方案,可以防止构造函数过于复杂并减少错误。

博客涵盖:

  1. 什么是构建器模式?
  2. 什么时候应该使用它?
  3. 构建器使用的真实示例
  4. 为什么这个模式如此重要?

以上是掌握构建器设计模式:简化复杂对象的创建的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

See all articles