工廠模式屬於建立型模式,它提供了一種建立對象的最佳方式。markdown
在工廠模式中,建立對象時不會對外暴露建立邏輯,而且經過一個共同的接口指向建立對象。ide
根據實現方式的不一樣,工廠模式能夠分爲簡單工廠模式、工廠方法模式。函數
簡單工廠模式又稱爲靜態工廠方法模式。你們常常使用的機械鍵盤有各類軸的,如紅軸、青軸、茶軸等等。如今有一個廠商能夠生產紅軸和青軸鍵盤,使用代碼該如何表現呢?spa
interface Keyboard { fun input() } class RedAxisKeyboard : Keyboard { override fun input() { println("Red axis keyboard inputting ...") } } class GreenAxisKeyboard : Keyboard { override fun input() { println("Green axis keyboard inputting ...") } } object Factory { fun make(axis: String): Keyboard? { return when (axis) { "red" -> RedAxisKeyboard() "green" -> GreenAxisKeyboard() else -> null } } } fun main() { Factory.make("red")?.input() Factory.make("green")?.input() } 複製代碼
在客戶端調用 Factory.make(type)
傳入 "red" or "green" 字符串就能夠建立相應的對象。code
這就是簡單工廠模式,使用類圖表示以下:orm
![]() |
---|
簡單工廠模式類圖 |
相信不用我說你們也能看出來這種寫法的弊端:對象
爲了解決增減產品帶來的問題,能夠將工廠抽象化,爲每一個產品創建單獨的工廠,這就是工廠方法模式。接口
![]() |
---|
工廠方法模式類圖 |
使用工廠方法模式改造鍵盤的生產:字符串
abstract class AbsKeyboardFactory { abstract fun make(): Keyboard } object RedAxisKeyboardFactory : AbsKeyboardFactory() { override fun make(): Keyboard = RedAxisKeyboard() } object GreenAxisKeyboardFactory : AbsKeyboardFactory() { override fun make(): Keyboard = GreenAxisKeyboard() } fun main() { RedAxisKeyboardFactory.make().input() GreenAxisKeyboardFactory.make().input() } 複製代碼
工廠改造完成後,新增產品只要新建工廠便可,好比新增茶軸鍵盤的製造:input
class TeaAxisKeyboard : Keyboard { override fun input() { println("Tea axis keyboard inputting ...") } } object TeaAxisKeyboardFactory : AbsKeyboardFactory() { override fun make(): Keyboard = TeaAxisKeyboard() } fun main() { TeaAxisKeyboardFactory.make().input() } 複製代碼
經過使用工廠方法模式,每一個工廠負責一個產品的建立工做,在新增產品的時候就不須要再修改原有的代碼,更易維護,下降了變動帶來的風險。