JS設計模式——工廠模式

什麼是工廠模式?

工廠模式(Factory Pattern)是創建型設計模式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來創建對象。

簡單工廠模式

假如有一個屏幕生產工廠,生產各類屏幕。每類屏幕都是一個類,如下,我們通過屏幕工廠類提供的 createScreen 統一接口來創建屏幕對象。這便是一個簡單工廠模式的應用。

// 屏幕工廠類
class ScreenFactory {	
	createScreen(type) {
	    if (type === "hd") {
	        return new HDScreen()
	    } else if(type === 'normal') {
	        return new NormalScreen()
	    } else {
	        return null
	    }
	}
}

// 高清屏幕類
class HDScreen {
    say() {
        console.log('I am HDScreen!')
    }
}

// 普通屏幕類
class NormalScreen {
    say() {
        console.log('I am NormalScreen!')
    }
}
// 創建屏幕工廠實例
var screenFactory = new ScreenFactory()

// 用統一接口 createScreen 分別創建高清屏幕和普通屏幕
var hdScreen = screenFactory.createScreen('hd')
var normalScreen = screenFactory.createScreen('normal')

hdScreen.say() // => 'I am HDScreen!'
normalScreen.say() // => 'I am NormalScreen!'

通過簡單工廠模式,我們對創建對象的過程做了一層封裝,從而達到解耦的目的。

這樣做的優勢就是,有一天某類屏幕子類名變了(比如 HDScreen 類名換成 SuperScreen),初始化的參數更新了,或者任何實現細節改變了,用戶都不需要關心,還是可以依舊用 createScreen 接口創建對象。反過來,如果不是用工廠模式,而是用原始的 new 操作創建對象,那麼用戶就需要考慮這些修改需不需要對舊代碼進行更新。

因此,避免隨意通過 new 來創建對象,對系統的後期維護會帶來很大便利。

工廠模式

雖然簡單工廠模式已經達到了解耦的目的,但是每次需要添加新零件類的時候,都需要對零件工廠類進行對應的修改(加個 if 判斷或者 switch 條件之類)。這樣就違背了開閉原則
所以我們希望一個工廠類就返回一個實例。即對每個屏幕類也進行工廠模式的封裝。
如下:

// 高清屏幕工廠
class HDScreenFactory {
    createScreen() {
        return new HDScreen()
    }
}

// 普通屏幕工廠
class NormalScreenFactory {
    createScreen() {
        return new NormalScreen()
    }
}

// 高清屏幕類
class HDScreen {
    say() {
        console.log('I am HDScreen!')
    }
}

// 普通屏幕類
class NormalScreen {
    say() {
        console.log('I am NormalScreen!')
    }
}

// 創建高清屏幕工廠實例
var hdScreenFactory = new HDScreenFactory()

// 用統一接口 createScreen 分別創建高清屏幕
var hdScreen = hdScreenFactory.createScreen()

hdScreen.say() // => 'I am HDScreen!'

這樣就不需要通過參數的形式區分該實例化哪個類,同時當需要再添加一個 UltraHDSreen 超高清屏幕類型時,我們就不需要對原有代碼進行改動。

抽象工廠模式

抽象工廠模式可以理解成工廠的工廠,封裝一組具有共同目標的單一工廠。

對於手機工廠,不僅需要生產屏幕,還需要生產攝像頭等。這裏添加了一個旗艦手機工廠,
在創建屏幕和攝像頭時,我們直接用旗艦手機工廠去創建。

當然如果是其他類型的手機,可以用其對應的手機工廠創建,實例中沒有列出。

在抽象工廠模式下,產品和零件在一個工廠中組合爲一個整體,更加抽象。與此同時也增加了系統的複雜度。

// 手機工廠
class PhoneFactory {
    createScreen() {}
    createCamera() {}
}

// 旗艦手機工廠
class FlagShipPhoneFactory {
    createScreen() {
        return new HDScreen()
    }

    createCamera() {
        return new HDCamera()
    }
}

// 高清屏幕工廠
class HDScreenFactory {
    createScreen() {
        return new HDScreen()
    }
}

// 普通屏幕工廠
class NormalScreenFactory {
    createScreen() {
        return new NormalScreen()
    }
}

// 高清攝像頭工廠
class HDCameraFactory {
    createCamera() {
        return new HDCamera()
    }
}

// 高清攝像頭類
class HDCamera {
    say() {
        console.log('I am HDCamera!')
    }
}

// 高清屏幕類
class HDScreen {
    say() {
        console.log('I am HDScreen!')
    }
}

// 普通屏幕類
class NormalScreen {
    say() {
        console.log('I am NormalScreen!')
    }
}

// 創建旗艦手機工廠實例
var phone = new FlagShipPhoneFactory()

// 用統一接口分別創建旗艦手機的屏幕和攝像頭
var screen = phone.createScreen()
var camera = phone.createCamera()

screen.say() // => 'I am HDScreen!'
camera.say() // => 'I am HDCamera!'

以上便是工廠模式的全部內容。

發佈了63 篇原創文章 · 獲贊 58 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章