工厂模式:创建型设计模式解析

2025/3/9
本文详细介绍了工厂模式这一创建型设计模式,包括其核心思想、三种类型(简单工厂模式、工厂方法模式和抽象工厂模式)及其应用场景,通过代码示例展示具体实现,并总结了不同模式的适用场景和优势。
简单工厂模式UML图,工厂方法模式UML图,抽象工厂模式UML图,不同工厂模式对比图

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式的核心思想是将对象的创建过程封装起来,使得客户端代码与具体类的实例化过程解耦。工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。

1. 简单工厂模式

简单工厂模式是最基础的工厂模式,它通过一个工厂类来创建不同类型的对象。客户端只需要知道工厂类,而不需要知道具体的产品类。

应用场景:

  • 当对象的创建逻辑相对简单,且不需要频繁扩展时。
  • 当客户端不需要知道具体产品的类名,只需要知道工厂类即可。
class ProductA {
  use() {
    console.log('Using Product A');
  }
}

class ProductB {
  use() {
    console.log('Using Product B');
  }
}

class SimpleFactory {
  createProduct(type) {
    switch (type) {
      case 'A':
        return new ProductA();
      case 'B':
        return new ProductB();
      default:
        throw new Error('Unknown product type');
    }
  }
}

const factory = new SimpleFactory();
const productA = factory.createProduct('A');
productA.use(); // Output: Using Product A

2. 工厂方法模式

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类。

应用场景:

  • 当对象的创建逻辑较为复杂,且需要根据不同的条件创建不同的对象时。
  • 当系统需要支持扩展,且不希望修改现有代码时。
class Product {
  use() {
    throw new Error('Abstract method!');
  }
}

class ProductA extends Product {
  use() {
    console.log('Using Product A');
  }
}

class ProductB extends Product {
  use() {
    console.log('Using Product B');
  }
}

class Factory {
  createProduct() {
    throw new Error('Abstract method!');
  }
}

class FactoryA extends Factory {
  createProduct() {
    return new ProductA();
  }
}

class FactoryB extends Factory {
  createProduct() {
    return new ProductB();
  }
}

const factoryA = new FactoryA();
const productA = factoryA.createProduct();
productA.use(); // Output: Using Product A

3. 抽象工厂模式

抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于创建一组相关的产品。

应用场景:

  • 当系统需要创建一组相关的产品,且这些产品之间有依赖关系时。
  • 当系统需要支持多种产品族,且不希望客户端代码与具体产品类耦合时。
class ProductA1 {
  use() {
    console.log('Using Product A1');
  }
}

class ProductA2 {
  use() {
    console.log('Using Product A2');
  }
}

class ProductB1 {
  use() {
    console.log('Using Product B1');
  }
}

class ProductB2 {
  use() {
    console.log('Using Product B2');
  }
}

class AbstractFactory {
  createProductA() {
    throw new Error('Abstract method!');
  }

  createProductB() {
    throw new Error('Abstract method!');
  }
}

class ConcreteFactory1 extends AbstractFactory {
  createProductA() {
    return new ProductA1();
  }

  createProductB() {
    return new ProductB1();
  }
}

class ConcreteFactory2 extends AbstractFactory {
  createProductA() {
    return new ProductA2();
  }

  createProductB() {
    return new ProductB2();
  }
}

const factory1 = new ConcreteFactory1();
const productA1 = factory1.createProductA();
const productB1 = factory1.createProductB();
productA1.use(); // Output: Using Product A1
productB1.use(); // Output: Using Product B1

总结

工厂模式的核心优势在于它将对象的创建过程与使用过程分离,使得系统更加灵活、可扩展。简单工厂模式适用于简单的场景,工厂方法模式适用于需要扩展的场景,而抽象工厂模式适用于需要创建一组相关产品的场景。在实际开发中,应根据具体需求选择合适的工厂模式。

标签:设计模式
上次更新:

相关文章

npx完全指南:前端开发必备工具详解 | 20年架构师深度解析

本文由20年前端架构师深入解析npx工具,涵盖其核心功能、优势、高级用法、最佳实践及与npm/yarn的区别比较,帮助开发者掌握这一现代前端开发利器。

·前端开发

<处理关联数据的最佳实践:Article 与 Tags 的关系 | 开发指南>

<本文详细介绍了在开发中处理关联数据(如 Article 和 Tags 的多对多关系)的最佳实践,包括拆分业务逻辑、使用事务保证数据一致性、合理设计关联表结构、批量操作、幂等性和乐观锁等关键要点,并提供了基于 mysql2 和 Sequelize 的代码示例。>

·后端开发

Astro 静态站点生成器:构建高性能网站的最佳选择

Astro 是一个专注于构建快速、轻量级网站的静态站点生成器,支持多种前端框架,采用岛屿架构减少 JavaScript 加载,提升性能。

·前端开发

MySQL外键约束详解:维护数据一致性与完整性

本文详细介绍了MySQL中的外键约束(Foreign Key Constraint),包括其基本概念、创建方法、作用、级联操作、限制、修改与删除方法、查看方式以及最佳实践。通过合理使用外键约束,可以有效管理数据库中的数据关系,确保数据的准确性和可靠性。

·后端开发

MySQL JSON数据类型支持与使用指南 | 详细解析与示例

本文详细解析了MySQL从5.7版本开始支持的JSON数据类型,包括版本支持、创建JSON字段、插入与查询JSON数据、修改JSON数据、生成JSON、索引优化、性能与应用场景、注意事项及示例全流程。

·后端开发

SQL JOIN、LEFT JOIN 和 RIGHT JOIN 的区别与应用场景详解

本文详细介绍了 SQL 中 JOIN、LEFT JOIN 和 RIGHT JOIN 的区别,包括它们的作用、语法、示例以及实际应用场景,帮助读者更好地理解和使用这些连接方式。

·后端开发

Weex 跨平台移动开发框架:核心特性与使用指南

Weex 是由阿里巴巴开源的跨平台移动开发框架,支持使用 Vue.js 或 Rax 构建高性能的 iOS、Android 和 Web 应用。本文详细解析了 Weex 的核心特性、架构、工作流程、组件和模块、开发工具、优缺点、应用场景及未来发展。

·前端开发

ECharts 与 DataV 数据可视化工具对比分析 | 选择指南

本文详细对比了 ECharts 和 DataV 两个常用的数据可视化工具,包括它们的设计目标、优缺点、使用场景和技术栈,帮助读者根据具体需求选择合适的工具。

·前端开发

前端部署后通知用户刷新页面的常见方案 | 单页应用更新提示

本文介绍了在前端部署后通知用户刷新页面的几种常见方案,包括WebSocket实时通知、轮询检查版本、Service Worker版本控制、版本号对比、自动刷新、使用框架内置功能以及第三方库。每种方案的优缺点和示例代码均有详细说明。

·前端开发

TypeScript 映射类型常见问题与解决方案 | 提升代码维护性

本文探讨了在使用 TypeScript 时,映射类型的不当使用可能导致的问题,如代码难以维护、类型推断不准确或性能问题,并提供了相应的解决方案和最佳实践。

·编程语言