解释什么是工厂模式,有什么优缺点?
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定将要创建的对象的确切类。工厂模式通过使用一个共同的接口来指向新创建的对象,以此来隐藏产品的具体实现。
工厂模式的类型
工厂模式主要分为三种类型:
- 简单工厂模式(Simple Factory):由一个工厂对象决定创建出哪一种产品类的实例。
- 工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
- 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
工厂模式的优点
- 解耦:工厂模式可以将对象的创建和使用分离,降低系统的耦合度。
- 可扩展性:新增产品类时,只需扩展工厂类,符合开闭原则(对扩展开放,对修改关闭)。
- 控制对象的创建:工厂模式可以集中管理对象的创建,便于系统的维护和优化。
- 代码复用:工厂模式可以避免重复的创建对象代码,提高代码的复用性。
工厂模式的缺点
- 增加复杂性:引入工厂模式会增加系统的复杂性,增加新的类和接口。
- 不直接:使用工厂模式创建对象不如直接使用
new
关键字创建对象直观。 - 工厂类职责过重:如果工厂类负责创建的对象过多,会导致工厂类逻辑过于复杂,不利于维护。
示例:简单工厂模式
class Product {
constructor() {
if (new.target === Product) {
throw new Error('抽象类不能实例化');
}
}
operation() {
throw new Error('子类必须实现 operation 方法');
}
}
class ConcreteProductA extends Product {
operation() {
return 'ConcreteProductA operation';
}
}
class ConcreteProductB extends Product {
operation() {
return 'ConcreteProductB operation';
}
}
class SimpleFactory {
createProduct(type) {
switch (type) {
case 'A':
return new ConcreteProductA();
case 'B':
return new ConcreteProductB();
default:
throw new Error('Unsupported product type');
}
}
}
const factory = new SimpleFactory();
const productA = factory.createProduct('A');
console.log(productA.operation()); // 输出 'ConcreteProductA operation'
在这个示例中,SimpleFactory
负责根据传入的参数创建不同的产品对象。这种方式使得客户端代码不需要直接实例化具体的产品类,从而实现了创建和使用的分离。
近期评论