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
這個抽象類別,由 Sword
和 Knife
來實做,而 WeaponFactory
用來產生各種類型與不同長度的 Sword
與 Knife
,這樣我們只需要知道 WeaponFactory
的 createShortSword()
可以產生出固定長度為 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