什么是工厂模式,有什么优点

99 阅读2分钟

什么是工厂模式,有什么优点

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式通过一个工厂方法或工厂类来封装对象的创建逻辑,使得客户端代码与具体类的实现解耦。

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