ES6中工厂方法模式通过抽象基类定义createProduct()方法并由子类实现,实现对象创建逻辑与使用逻辑解耦;也可用静态工厂方法简化实现。

ES6 类可以通过定义一个创建对象的接口(比如一个方法),让子类决定实例化哪一个类,从而实现工厂方法模式。核心是把对象的创建逻辑从具体类中抽离出来,交由子类或专门的工厂类负责。
用抽象基类定义工厂方法
先定义一个抽象类,其中声明一个createProduct()方法,不提供具体实现,强制子类重写:
class Creator {
// 抽象方法:子类必须实现
createProduct() {
throw new Error("子类必须实现 createProduct 方法");
}
// 模板方法:定义使用流程,依赖子类提供的产品
operate() {
const product = this.createProduct();
return product.operation();
}
}
子类实现具体创建逻辑
不同子类返回不同类型的实例,体现“工厂方法”的多态性:
class ConcreteProductA {
operation() {
return "执行 ProductA 的逻辑";
}
}
class ConcreteProductB {
operation() {
return "执行 ProductB 的逻辑";
}
}
class ConcreteCreatorA extends Creator {
createProduct() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
createProduct() {
return new ConcreteProductB();
}
}
实际调用示例
使用者只需面向 Creator 接口编程,无需关心具体产品如何构造:
立即学习“Java免费学习笔记(深入)”;
const creatorA = new ConcreteCreatorA(); console.log(creatorA.operate()); // "执行 ProductA 的逻辑" const creatorB = new ConcreteCreatorB(); console.log(creatorB.operate()); // "执行 ProductB 的逻辑"
更灵活的工厂类写法(非继承式)
如果不想用继承,也可以用普通类 + 静态工厂方法,配合参数控制类型:
class ProductFactory {
static create(type) {
switch (type) {
case 'A': return new ConcreteProductA();
case 'B': return new ConcreteProductB();
default: throw new Error("不支持的产品类型");
}
}
}
// 使用
const p1 = ProductFactory.create('A');
const p2 = ProductFactory.create('B');
这种写法更轻量,适合简单场景;而继承式更符合经典工厂方法模式的结构,利于扩展和类型约束。关键是把“创建什么”和“怎么用”解耦,提升可维护性和可测试性。


















