工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。
具有高度標準化和同質性的特點,僅存在一些很小的差異。
舉例來說,使用工廠模式來管理電子商務網站裡面的多種類型的產品,例如電腦、手機、平板等品項就不必關心每種產品的具體細節。同時,工廠模式巧妙地運用了多型的概念,讓客戶端代碼可以透過通用的介面和方法來操作不同類型的產品,這增加了代碼的靈活性和可讀性。
//共同有輪子和車子的類型
interface Car {
wheelNumber: number
carType: string
getType(): string
getName(): string
}
//輪子和車子的類型內容不一樣
class BMW implements Car {
wheelNumber: number = 4
carType: string = "car"
getType = () => this.carType
getName = () => this.constructor.name
}
class Mitsubishi_Fuso implements Car {
wheelNumber: number = 4
carType: string = "truck"
getType = () => this.carType
getName = () => this.constructor.name
}
class RAV4 implements Car {
wheelNumber: number = 4
carType: string = "rv"
getType = () => this.carType
getName = () => this.constructor.name
}
//將製造車子的程式碼包裝在工廠模式中
class SimpleFactory {
static getCar = (type: string) => {
switch (type) {
case "BMW": return new BMW()
case "mitsubishi": return new Mitsubishi_Fuso()
case "RAV": return new RAV4()
}
}
}
//簡單工廠模式
const car1 = SimpleFactory.getCar('BMW')
const car2 = SimpleFactory.getCar('mitsubishi')
const car3 = SimpleFactory.getCar('RAV')
console.log(car1?.getName(), "-->", car1?.getType())
console.log(car2?.getName(), "-->", car2?.getType())
console.log(car3?.getName(), "-->", car3?.getType())
// BMW --> car
// MitsubishiFuso --> truck
// RAV4 --> rv
//將改成工廠改成專一化,讓每個工廠都專門生產自己的車子。
class Factory {
//擁有 getCar的屬性
static getCar() {
}
}
//好處是未來需要什麼樣的車子,就去建立它專屬的工廠
class BMWFactory implements Factory {
static getCar() {
return new BMW()
}
}
class MitsubishiFusoFactory implements Factory {
static getCar() {
return new MitsubishiFuso()
}
}
class RAV4Factory implements Factory {
static getCar() {
return new RAV4()
}
}
const car1 = BMWFactory.getCar()
const car2 = MitsubishiFusoFactory.getCar()
const car3 = RAV4Factory.getCar()
console.log(car1.getName(), "-->", car1.getType())
console.log(car2.getName(), "-->", car2.getType())
console.log(car3.getName(), "-->", car3.getType())
// BMW --> car
// MitsubishiFuso --> truck
// RAV4 --> rv