定义:定义一个创建对象的接口,但由子类决定实例化哪一个类

类比:一家饮料工厂可以生产不同口味的饮料,橙汁、可乐、柠檬水等,但工厂的生产线是一样的。不同口味由具体的生产方法决定

应用场景

  • 在代码中指定实现类时机不明确,或者想要在运行时动态决定具体实现
  • 客户端不需要知道所创建对象的具体类

优缺点

  • 优点:
    • 提供一种创建对象的更灵活的方式
    • 客户端无需知道所创建对象的具体类,符合开闭原则
  • 缺点:
    • 增加代码复杂性,增加了系统中类的数量

实现代码

interface Product {
  operation(): string;
}
 
class ConcreteProductA implements Product {
  public operation(): string {
    return 'Result of ConcreteProductA';
  }
}
 
class ConcreteProductB implements Product {
  public operation(): string {
    return 'Result of ConcreteProductB';
  }
}
 
abstract class Creator {
  public abstract factoryMethod(): Product;
 
  public someOperation(): string {
    const product = this.factoryMethod();
    return `Creator: The same creator's code has just worked with ${product.operation()}`;
  }
}
 
class ConcreteCreatorA extends Creator {
  public factoryMethod(): Product {
    return new ConcreteProductA();
  }
}
 
class ConcreteCreatorB extends Creator {
  public factoryMethod(): Product {
    return new ConcreteProductB();
  }
}
 
function clientCode(creator: Creator) {
  console.log(creator.someOperation());
}
 
clientCode(new ConcreteCreatorA());
clientCode(new ConcreteCreatorB());