帰宅後科学者

オタクですが何か?

TypeScript Design Pattern 系列 - Factory Method Pattern

Factory Method Pattern (工廠方法模式)顧名思義是一種在 OOP 實現了所謂的工廠運作概念的一種 design pattern 。

工廠是一種用來建立 object 的實體,與直接使用 new 產生 object 不同的是工廠方法是一種抽象的產生 object 的建構方法。例如有一家武器工廠專門生產長劍、短劍、小刀等武器,你只需要透過這個工廠所提供的方法就能夠產生這些武器。

實做

// factory_method/weaponFactory.ts

export abstract class Weapon {
  weaponType: string;
  length: number;

  constructor(weaponType: string, length: number) {
    this.weaponType = weaponType;
    this.length = length;
  }

  getInfo(): string {
    return `Type: ${this.weaponType} - ${this.length} cm`;
  }
}

class Sword extends Weapon {
  constructor(length: number) {
    super("Sword", length);
  }
}

class Knife extends Weapon {
  constructor(length: number) {
    super("Knife", length);
  }
}

export class WeaponFactory {
  createLongSword(): Sword {
    return new Sword(150);
  }

  createShortSword(): Sword {
    return new Sword(100);
  }

  createKnife(): Knife {
    return new Knife(50);
  }
}

上面定義了 Weapon 這個抽象類別,由 SwordKnife 來實做,而 WeaponFactory 用來產生各種類型與不同長度的 SwordKnife ,這樣我們只需要知道 WeaponFactorycreateShortSword() 可以產生出固定長度為 100 的 Sword ,而不需要管 Sword 是如何被產生的。

Demo

// factory_method/demo.ts

import { Weapon, WeaponFactory } from './weaponFactory';

const factory: WeaponFactory = new WeaponFactory();
const longSword: Weapon = factory.createLongSword();
const shortSword: Weapon = factory.createShortSword();
const knife: Weapon = factory.createKnife();

console.log(longSword.getInfo()); // Type: Sword - 150 cm
console.log(shortSword.getInfo()); // Type: Sword - 100 cm
console.log(knife.getInfo()); // Type: Knife - 50 cm

以上參考自 https://github.com/torokmark/design_patterns_in_typescript/tree/master/factory_method