Skip to content

3.0 简介:创建型模式 (Creational Patterns)

欢迎来到设计模式的第一个正式分类——创建型模式。

在之前的“核心入门模式”中,我们已经接触过一位这个家族的成员:工厂模式。它的核心任务是帮我们“生产”对象。现在,我们将系统地探索整个“生产部门”的运作方式。

本章节所有模式,都围绕着一个核心问题:

“我应该如何创建对象,才能让我的系统更灵活、更易于维护?”

一、问题的根源:new 关键字的“罪与罚”

在编程中,最直接的对象创建方式就是使用 new 关键字。

javascript
let user;
if (role === "admin") {
  user = new Admin();
} else if (role === "editor") {
  user = new Editor();
} else {
  user = new User();
}

这种写法简单直接,但在大型项目中,它会带来诸多问题:

  1. 紧密耦合:代码的使用方(客户端)必须明确知道 Admin, Editor, User 这些具体类的存在。如果这些类的名字变了,或者构造函数参数变了,所有用到它们的地方都得跟着改。
  2. 逻辑僵化:每当需要支持一个新的角色类型,你就必须回来修改这段 if...else 代码,违反了“开放/封闭原则”。
  3. 过程暴露:如果创建某个对象的过程非常复杂(比如需要多个步骤的配置),这些复杂的逻辑会散落在代码的各个角落,难以管理。

直接使用 new 关键字,就像是要求每个想开车的人都必须亲自去流水线上把发动机、轮子、座椅一个个组装起来。这显然是不现实的。

二、核心思想:让“专业的人”去做“专业的事”

所有创建型模式的“初心”,都是为了解决上述问题。它们共同的核心思想是:

将对象的创建过程 (How to create) 与对象的使用过程 (How to use) 进行分离。

我们引入一个“专业的创建者”(比如一个工厂),把所有复杂的、易变的创建逻辑都封装到它里面。而使用者(客户端代码)不再关心对象是如何被创建的,它只需要向这个“创建者”提出请求,拿到最终的产品即可。

核心比喻:汽车制造厂

  • 使用者 (你):你只需要告诉厂商“我想要一辆红色的、带天窗的 SUV”。
  • 创建者 (汽车厂):它负责采购钢材、组装发动机、喷漆、安装天窗... 等所有复杂的内部流程。
  • 产品 (汽车):你最终得到可以直接使用的汽车。

你完全不需要关心汽车是怎么造出来的。而且,如果工厂的生产线升级了(创建逻辑变化),你作为使用者是无感的,你拿到的依然是一辆符合你要求的汽车。

这种分离带来了巨大的好处:

  • 灵活性:系统可以轻松地切换不同的“创建者”,从而改变对象的创建方式,而无需修改使用方的代码。
  • 封装性:复杂的创建逻辑被隐藏起来,让客户端代码更简洁、更易于理解。
  • 复用性:创建逻辑可以被多处复用。

三、本章学习地图

在本章,我们将学习以下几个经典且在 JavaScript 中非常实用的创建型模式:

  1. 原型模式 (Prototype Pattern)

    • 一句话简介:不通过 new,而是通过“克隆”一个已有的对象来创建新对象。
    • 适用场景:当创建一个对象的成本很高时(例如,需要复杂的计算或网络请求),或者需要创建大量相似对象时。
  2. 建造者模式 (Builder Pattern)

    • 一句话简介:像搭乐高一样,一步步地构建一个复杂的对象。
    • 适用场景:当一个对象的构造过程包含多个步骤,且这些步骤的组合可以产生不同表示时。

我们已经学过的 工厂模式单例模式 也都属于创建型模式。通过本章的学习,你将对“如何优雅地创建对象”有一个全面而深入的理解。