工廠模式(Factory Pattern)

模式定義

工廠模式屬於建立型模式,它提供了一種建立對象的最佳方式。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

這就是簡單工廠模式,使用類圖表示以下:對象

image-20191016163751004
簡單工廠模式類圖

相信不用我說你們也能看出來這種寫法的弊端:blog

  • 傳參容易出錯(可使用枚舉或者在工廠類中爲每一個產品提供建立函數解決該問題)。
  • 新增或者減小產品時須要修改工廠類(違反了開閉原則)。

工廠方法模式

爲了解決增減產品帶來的問題,能夠將工廠抽象化,爲每一個產品創建單獨的工廠,這就是工廠方法模式。接口

image-20191016172114663
工廠方法模式類圖

使用工廠方法模式改造鍵盤的生產:字符串

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()
}
複製代碼

經過使用工廠方法模式,每一個工廠負責一個產品的建立工做,在新增產品的時候就不須要再修改原有的代碼,更易維護,下降了變動帶來的風險。

相關文章
相關標籤/搜索