Appearance
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();
}这种写法简单直接,但在大型项目中,它会带来诸多问题:
- 紧密耦合:代码的使用方(客户端)必须明确知道
Admin,Editor,User这些具体类的存在。如果这些类的名字变了,或者构造函数参数变了,所有用到它们的地方都得跟着改。 - 逻辑僵化:每当需要支持一个新的角色类型,你就必须回来修改这段
if...else代码,违反了“开放/封闭原则”。 - 过程暴露:如果创建某个对象的过程非常复杂(比如需要多个步骤的配置),这些复杂的逻辑会散落在代码的各个角落,难以管理。
直接使用 new 关键字,就像是要求每个想开车的人都必须亲自去流水线上把发动机、轮子、座椅一个个组装起来。这显然是不现实的。
二、核心思想:让“专业的人”去做“专业的事”
所有创建型模式的“初心”,都是为了解决上述问题。它们共同的核心思想是:
将对象的创建过程 (How to create) 与对象的使用过程 (How to use) 进行分离。
我们引入一个“专业的创建者”(比如一个工厂),把所有复杂的、易变的创建逻辑都封装到它里面。而使用者(客户端代码)不再关心对象是如何被创建的,它只需要向这个“创建者”提出请求,拿到最终的产品即可。
核心比喻:汽车制造厂
- 使用者 (你):你只需要告诉厂商“我想要一辆红色的、带天窗的 SUV”。
- 创建者 (汽车厂):它负责采购钢材、组装发动机、喷漆、安装天窗... 等所有复杂的内部流程。
- 产品 (汽车):你最终得到可以直接使用的汽车。
你完全不需要关心汽车是怎么造出来的。而且,如果工厂的生产线升级了(创建逻辑变化),你作为使用者是无感的,你拿到的依然是一辆符合你要求的汽车。
这种分离带来了巨大的好处:
- 灵活性:系统可以轻松地切换不同的“创建者”,从而改变对象的创建方式,而无需修改使用方的代码。
- 封装性:复杂的创建逻辑被隐藏起来,让客户端代码更简洁、更易于理解。
- 复用性:创建逻辑可以被多处复用。
三、本章学习地图
在本章,我们将学习以下几个经典且在 JavaScript 中非常实用的创建型模式:
原型模式 (Prototype Pattern)
- 一句话简介:不通过
new,而是通过“克隆”一个已有的对象来创建新对象。 - 适用场景:当创建一个对象的成本很高时(例如,需要复杂的计算或网络请求),或者需要创建大量相似对象时。
- 一句话简介:不通过
建造者模式 (Builder Pattern)
- 一句话简介:像搭乐高一样,一步步地构建一个复杂的对象。
- 适用场景:当一个对象的构造过程包含多个步骤,且这些步骤的组合可以产生不同表示时。
我们已经学过的 工厂模式 和 单例模式 也都属于创建型模式。通过本章的学习,你将对“如何优雅地创建对象”有一个全面而深入的理解。