工厂模式
工厂模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定要实例化的类。工厂模式将对象的创建过程封装在一个单独的类或方法中,客户端通过调用这个类或方法来创建对象,而不直接使用 new 关键字。
工厂模式主要有三种变体:
-
简单工厂模式(Simple Factory Pattern): 提供一个单独的工厂类,负责创建对象。客户端通过调用工厂类的静态方法或方法来创建对象。
-
工厂方法模式(Factory Method Pattern): 定义一个创建对象的接口,但将实际的创建工作延迟到子类中。每个子类都可以实现这个接口以提供特定类型的对象。
-
抽象工厂模式(Abstract Factory Pattern): 提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
以下是一个简单的 JavaScript 示例,演示了简单工厂模式:
// 简单工厂
class CarFactory {
createCar(type) {
switch (type) {
case 'Sedan':
return new SedanCar();
case 'SUV':
return new SUVCar();
default:
throw new Error('Invalid car type.');
}
}
}
// 具体产品 - SedanCar
class SedanCar {
drive() {
console.log('Driving a sedan car.');
}
}
// 具体产品 - SUVCar
class SUVCar {
drive() {
console.log('Driving an SUV car.');
}
}
// 客户端代码
const factory = new CarFactory();
const sedan = factory.createCar('Sedan');
sedan.drive();
// Output: Driving a sedan car.
const suv = factory.createCar('SUV');
suv.drive();
// Output: Driving an SUV car.
在这个例子中,CarFactory
是简单工厂类,负责根据客户端请求创建不同类型的汽车对象。SedanCar
和 SUVCar
是具体产品类,它们实现了相同的接口。客户端通过简单工厂类来创建具体产品的实例。
工厂模式的优点包括封装了对象的创建过程,使得客户端代码与具体类的实现解耦。它提供了灵活性,允许在不修改客户端代码的情况下引入新的产品类型。
工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个创建对象的接口,但将实际的创建工作延迟到子类中。这样,每个子类都可以实现这个接口以提供特定类型的对象。
示例:
// 工厂方法接口
class CarFactory {
createCar() {
throw new Error('createCar method must be implemented by subclasses.');
}
}
// 具体工厂 - SedanCarFactory
class SedanCarFactory extends CarFactory {
createCar() {
return new SedanCar();
}
}
// 具体工厂 - SUVCarFactory
class SUVCarFactory extends CarFactory {
createCar() {
return new SUVCar();
}
}
// 客户端代码
const sedanFactory = new SedanCarFactory();
const sedan = sedanFactory.createCar();
sedan.drive();
// Output: Driving a sedan car.
const suvFactory = new SUVCarFactory();
const suv = suvFactory.createCar();
suv.drive();
// Output: Driving an SUV car.