在实际开发中,我们经常会遇到需要根据不同场景生成不同对象的情况。为了解决对象创建与使用之间的耦合问题,工厂模式应运而生。本文将以 JavaScript 为例,从简单工厂到工厂方法,再到抽象工厂,介绍工厂模式的多种实现方式,并通过多个场景的示例代码,帮助大家更好地理解和应用这一设计模式。
工厂模式简介
工厂模式属于创建型设计模式,其核心思想是将对象的创建过程封装起来,让调用者只需关注产品接口,而无需了解具体实现。这样可以降低系统各模块之间的耦合度,使得扩展和维护更加方便。
根据具体需求,工厂模式常见的变体包括:
- 简单工厂模式:由一个工厂类根据参数创建不同的产品实例;
- 工厂方法模式:通过定义抽象工厂接口,让子类决定实例化哪一个具体产品;
- 抽象工厂模式:用于创建一系列相关或相互依赖的产品。
接下来,我们分别介绍这些模式在 JavaScript 中的实现,并结合多种场景给出示例。
简单工厂模式
简单工厂模式将产品的创建逻辑集中在一个工厂方法中,根据传入参数返回相应的产品实例。适用于产品种类较少、逻辑简单的场景。
示例 1:产品选择
假设我们需要根据用户输入创建不同的产品对象,可以这样实现:
// 定义具体产品类
class ProductA {
use() {
console.log('使用产品 A');
}
}
class ProductB {
use() {
console.log('使用产品 B');
}
}
// 简单工厂类
class SimpleFactory {
static createProduct(type) {
switch (type.toLowerCase()) {
case 'a':
return new ProductA();
case 'b':
return new ProductB();
default:
throw new Error(`不支持的产品类型: ${type}`);
}
}
}
// 客户端调用
const product = SimpleFactory.createProduct('a');
product.use(); // 输出:使用产品 A
示例 2:几何图形
在图形绘制应用中,我们可能需要生成不同的几何图形对象,如圆形、正方形和三角形。简单工厂可以帮助我们根据形状名称动态创建对应实例。
// 定义图形基类
class Shape {
draw() {
throw new Error('抽象方法不能直接调用');
}
}
class Circle extends Shape {
draw() {
console.log('绘制圆形');
}
}
class Square extends Shape {
draw() {
console.log('绘制正方形');
}
}
class Triangle extends Shape {
draw() {
console.log('绘制三角形');
}
}
//