跳到主要内容

工厂方法

工厂方法模式解决什么问题?​

  • 问题: Creator 知道要创建一个 Product, 但不知道具体创建哪一个实现类;
  • 解法: 把实例化延迟到子类, 由不同的 ConcreteCreator 创建不同的 ConcreteProduct;
  • 收益: 新增产品只需新增 Creator 子类, 不必修改已有创建流程;

工厂方法模式包含哪些角色?​

  • Product: 声明 ConcreteProduct 需要实现的方法;
  • ConcreteProduct: 实现 Product 的实例类;
  • Creator: 声明工厂方法, 其返回值类型为 Product;
  • ConcreteCreator: 重写工厂方法, 返回某个 ConcreteProduct;

工厂方法

如何用 TypeScript 实现工厂方法模式?​

interface Interviewer {
askQuestions(): void;
}

class Programmer implements Interviewer {
askQuestions(): void {
console.log("Asking about program.");
}
}

class Farmer implements Interviewer {
askQuestions(): void {
console.log("Asking about farm.");
}
}

// Creator: 模板方法依赖工厂方法, 不依赖具体产品
abstract class HiringManager {
protected abstract makeInterviewer(): Interviewer;

takeInterview(): void {
this.makeInterviewer().askQuestions();
}
}

// ConcreteCreator: 每个子类决定实例化哪个产品
class DevelopmentManager extends HiringManager {
protected makeInterviewer(): Interviewer {
return new Programmer();
}
}

class MarketingManager extends HiringManager {
protected makeInterviewer(): Interviewer {
return new Farmer();
}
}

如何使用与扩展工厂方法模式?​

  • 使用: 调用 Creator 上依赖工厂方法的模板方法;
new DevelopmentManager().takeInterview(); // Asking about program.
new MarketingManager().takeInterview(); // Asking about farm.
  • 扩展: 新增一个产品时同时新增对应的 ConcreteCreator, 已有 Creator 不需要改动;