什么是工厂模式,有什么优点
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式通过一个工厂方法或工厂类来封装对象的创建逻辑,使得客户端代码与具体类的实现解耦。
1. 工厂模式的类型
-
简单工厂模式:
- 通过一个工厂方法根据输入参数创建不同的对象。
-
工厂方法模式:
- 定义一个创建对象的接口,但由子类决定实例化哪个类。
-
抽象工厂模式:
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
2. 简单工厂模式示例
class Car {
constructor(name) {
this.name = name;
}
drive() {
console.log(`${this.name} is driving.`);
}
}
class Truck {
constructor(name) {
this.name = name;
}
drive() {
console.log(`${this.name} is driving.`);
}
}
class VehicleFactory {
static createVehicle(type, name) {
switch (type) {
case 'car':
return new Car(name);
case 'truck':
return new Truck(name);
default:
throw new Error('Unknown vehicle type');
}
}
}
const car = VehicleFactory.createVehicle('car', 'Tesla');
car.drive(); // 输出: Tesla is driving.
const truck = VehicleFactory.createVehicle('truck', 'Ford');
truck.drive(); // 输出: Ford is driving.
3. 工厂方法模式示例
class Vehicle {
drive() {
console.log(`${this.name} is driving.`);
}
}
class Car extends Vehicle {
constructor(name) {
super();
this.name = name;
}
}
class Truck extends Vehicle {
constructor(name) {
super();
this.name = name;
}
}
class VehicleFactory {
createVehicle(name) {
throw new Error('This method must be overridden');
}
}
class CarFactory extends VehicleFactory {
createVehicle(name) {
return new Car(name);
}
}
class TruckFactory extends VehicleFactory {
createVehicle(name) {
return new Truck(name);
}
}
const carFactory = new CarFactory();
const car = carFactory.createVehicle('Tesla');
car.drive(); // 输出: Tesla is driving.
const truckFactory = new TruckFactory();
const truck = truckFactory.createVehicle('Ford');
truck.drive(); // 输出: Ford is driving.
4. 抽象工厂模式示例
class Car {
drive() {
console.log('Car is driving.');
}
}
class Truck {
drive() {
console.log('Truck is driving.');
}
}
class VehicleFactory {
createCar() {
throw new Error('This method must be overridden');
}
createTruck() {
throw new Error('This method must be overridden');
}
}
class ConcreteVehicleFactory extends VehicleFactory {
createCar() {
return new Car();
}
createTruck() {
return new Truck();
}
}
const factory = new ConcreteVehicleFactory();
const car = factory.createCar();
car.drive(); // 输出: Car is driving.
const truck = factory.createTruck();
truck.drive(); // 输出: Truck is driving.
5. 工厂模式的优点
-
解耦:
- 将对象的创建与使用分离,客户端代码无需关心具体类的实现。
-
可扩展性:
- 添加新的产品类型时,只需扩展工厂类,无需修改现有代码。
-
代码复用:
- 将对象的创建逻辑集中管理,避免重复代码。
-
易于测试:
- 可以通过模拟工厂类来测试客户端代码。
总结
| 类型 | 描述 | 优点 |
|---|---|---|
| 简单工厂模式 | 通过一个工厂方法创建对象 | 简单易用,适合简单场景 |
| 工厂方法模式 | 由子类决定创建的对象类型 | 符合开闭原则,易于扩展 |
| 抽象工厂模式 | 创建一系列相关或相互依赖的对象 | 适合复杂场景,支持产品族 |
工厂模式是一种强大的设计模式,合理使用可以提高代码的灵活性和可维护性。
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github