工厂模式
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样做的好处是将对象的创建与使用分离,提高了代码的灵活性和可维护性。
工厂模式的主要类型
- 简单工厂模式(Simple Factory):虽然不是 GoF(Gang of Four)提出的 23 种设计模式之一,但它是最基础的形式,通常被称为“静态工厂方法”。
- 工厂方法模式(Factory Method Pattern):定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。因此,工厂方法模式让类的实例化推迟到子类。
- 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
JavaScript 中的工厂模式实现
下面以 JavaScript 为例,展示如何实现这三种类型的工厂模式。
简单工厂模式
javascript
function createCar(type) {
if (type === "Sedan") {
return new Sedan();
} else if (type === "SUV") {
return new SUV();
}
}
function Sedan() {
this.type = "Sedan";
}
function SUV() {
this.type = "SUV";
}
const sedan = createCar("Sedan");
console.log(sedan.type); // 输出: Sedan在这个例子中,createCar 函数根据传入的参数决定返回哪个类的实例。
工厂方法模式
javascript
class CarFactory {
createCar(type) {
throw new Error("This method should be overridden");
}
}
class SedanFactory extends CarFactory {
createCar() {
return new Sedan();
}
}
class SUVFactory extends CarFactory {
createCar() {
return new SUV();
}
}
class Sedan {
constructor() {
this.type = "Sedan";
}
}
class SUV {
constructor() {
this.type = "SUV";
}
}
const sedanFactory = new SedanFactory();
const sedan = sedanFactory.createCar();
console.log(sedan.type); // 输出: Sedan
const suvFactory = new SUVFactory();
const suv = suvFactory.createCar();
console.log(suv.type); // 输出: SUV这里,CarFactory 提供了 createCar 方法的接口,但具体的实现是由其子类完成的。
抽象工厂模式
抽象工厂模式适用于需要创建一系列相关的对象而不指定/暴露这些对象的具体类的情况。以下是一个简单的示例:
javascript
class AbstractFactory {
createWheel() {}
createEngine() {}
}
class SedanFactory extends AbstractFactory {
createWheel() {
return new SedanWheel();
}
createEngine() {
return new SedanEngine();
}
}
class SUVFactory extends AbstractFactory {
createWheel() {
return new SUVWheel();
}
createEngine() {
return new SUVEngine();
}
}
// 假设 Wheel 和 Engine 类已经定义好
const sedanFactory = new SedanFactory();
const sedanWheel = sedanFactory.createWheel();
const sedanEngine = sedanFactory.createEngine();
console.log(sedanWheel instanceof SedanWheel); // 输出: true
console.log(sedanEngine instanceof SedanEngine); // 输出: true在抽象工厂模式中,AbstractFactory 定义了一系列的方法来创建不同类型的对象,但是不实现它们;具体的实现由不同的工厂子类提供。
应用场景
- 当一个类无法预料要创建哪种类的对象或其需要与其他类一起工作创建对象时。
- 需要为一个产品族提供一致的创建接口。
- 想让用户只关心产品的接口而不是实现时。
工厂模式通过封装对象的创建过程,使得系统更加灵活、易于扩展,并且可以很好地适应需求的变化。