推荐答案
// www.javascriptcn.com code example
// 定义抽象产品接口(可选,但有助于理解工厂模式)
class Product {
constructor(name) {
this.name = name;
}
operation() {
console.log(`Product ${this.name} operation.`);
}
}
// 具体产品类 A
class ConcreteProductA extends Product{
constructor(name) {
super(name);
}
operation() {
console.log(`ConcreteProductA ${this.name} operation.`);
}
}
// 具体产品类 B
class ConcreteProductB extends Product{
constructor(name) {
super(name);
}
operation() {
console.log(`ConcreteProductB ${this.name} operation.`);
}
}
// 工厂类
class Factory {
createProduct(type, name) {
switch (type) {
case 'A':
return new ConcreteProductA(name);
case 'B':
return new ConcreteProductB(name);
default:
throw new Error('Invalid product type.');
}
}
}
// 使用工厂
const factory = new Factory();
const productA = factory.createProduct('A', "productA");
const productB = factory.createProduct('B', "productB");
productA.operation();
productB.operation();本题详细解读
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需向客户端暴露创建逻辑。简单来说,工厂模式将对象的实例化过程封装在一个单独的类(工厂)中,客户端只需要提供需要的类型,工厂负责返回对应的实例。
工厂模式的主要优点:
- 封装性: 将对象的创建逻辑封装在工厂类中,客户端无需知道具体的创建过程,降低了耦合度。
- 易于扩展: 当需要添加新的产品类型时,只需要修改工厂类,而不需要修改客户端代码,符合开闭原则。
- 可维护性: 创建逻辑集中管理,方便维护和修改。
- 代码复用: 减少重复的代码,提高代码的可读性和可维护性。
代码解读:
Product类 (抽象产品接口 - 可选): 定义了产品的公共接口operation(),虽然不是强制的,但有助于理解不同具体产品之间的关系,并可以在类型检查时用到。ConcreteProductA和ConcreteProductB类 (具体产品类): 实现了Product接口,代表两种不同的产品,它们都有自己的operation()实现。Factory类 (工厂类):createProduct(type,name)方法是工厂的核心,接受一个type参数和name参数,根据类型创建并返回对应的ConcreteProduct实例。- 使用
switch语句判断产品类型,并返回相应的产品实例。 - 如果
type不合法,则抛出一个错误。
使用示例:
- 创建一个工厂实例
factory。 - 调用
factory.createProduct()方法创建ConcreteProductA和ConcreteProductB的实例。 - 调用产品实例的
operation()方法,验证返回的是正确的产品类型。
- 创建一个工厂实例
何时使用工厂模式:
- 当创建对象的逻辑复杂,不希望直接暴露给客户端时。
- 当需要根据不同的条件创建不同类型的对象时。
- 当需要扩展新的对象类型,而不想修改现有代码时。
- 当需要控制对象的创建过程时,例如,缓存、单例等。
其他工厂模式的变体:
- 简单工厂模式: 工厂类只包含一个静态方法,根据不同的参数返回不同的对象实例,实现最简单的工厂功能。
- 抽象工厂模式: 提供了创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。相比普通工厂模式,可以创建多个工厂,每个工厂生产一组相互依赖的产品。