工廠模式屬於建立型模式,它提供了一種建立對象的最佳方式。ide
在工廠模式中,建立對象時不會對外暴露建立邏輯,而且經過一個共同的接口指向建立對象。函數
根據實現方式的不一樣,工廠模式能夠分爲簡單工廠模式、工廠方法模式。spa
簡單工廠模式又稱爲靜態工廠方法模式。你們常常使用的機械鍵盤有各類軸的,如紅軸、青軸、茶軸等等。如今有一個廠商能夠生產紅軸和青軸鍵盤,使用代碼該如何表現呢?code
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" 字符串就能夠建立相應的對象。cdn
這就是簡單工廠模式,使用類圖表示以下:對象
![]() |
---|
簡單工廠模式類圖 |
相信不用我說你們也能看出來這種寫法的弊端:blog
爲了解決增減產品帶來的問題,能夠將工廠抽象化,爲每一個產品創建單獨的工廠,這就是工廠方法模式。接口
![]() |
---|
工廠方法模式類圖 |
使用工廠方法模式改造鍵盤的生產:字符串
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()
}
複製代碼
經過使用工廠方法模式,每一個工廠負責一個產品的建立工做,在新增產品的時候就不須要再修改原有的代碼,更易維護,下降了變動帶來的風險。