工廠模式--個體戶的進(jìn)化之路(上)

大熊家里拆遷了,終于不用當(dāng)房產(chǎn)中介了,熊爸熊媽拿出一部分錢來讓大熊去做生意

大熊決定開一個彩筆廠,生產(chǎn)五顏六色的彩筆給小朋友。ps:大熊是菜逼,所以要從頭開始學(xué)習(xí)。

大熊就想著先建一個簡單的工廠唄,做些最基礎(chǔ)的彩筆

1·簡單工廠模式

先定個接口,聲明下彩筆應(yīng)該是啥樣的

interface Pen {
    //定義一堆彩筆的屬性,先來個顏色,其他再說。。。
    //顏色
    fun color()
}

然后定義一堆彩筆

//紅色的彩筆
class RedPen : Pen {
    override fun color() {
        println("我畫紅色的線條!")
    }
}
//綠色的彩筆
class GreenPen: Pen {
    override fun color() {
        println("我畫綠色的線條!")
    }
}
//藍(lán)色的彩筆
class BluePen : Pen {
    override fun color() {
        println("我畫藍(lán)色的線條!")
    }
}

大熊設(shè)計好了彩筆后,就需要建造個家庭小作坊來生產(chǎn)了

//彩筆小作坊工廠(簡單工廠模式)
class EasyPenFactory {
    companion object {
        @JvmStatic
        fun createPen(color: String): Pen {
            var newPen: Pen = RedPen()//默認(rèn)生產(chǎn)紅色
            when (color) {
                "r" -> newPen = RedPen()
                "g" -> newPen = GreenPen()
                "b" -> newPen = BluePen()
            }
            return newPen
        }
    }
}

接下來就是來啥訂單做啥彩筆了

fun main(args: Array<String>) {

    var redPen = EasyPenFactory.createPen("r")
    var greenPen = EasyPenFactory.createPen("g")
    var bluePen = EasyPenFactory.createPen("b")

    println(redPen.color())
    println(greenPen.color())
    println(bluePen.color())
}
---------------------------------------------------
logcat:
我畫紅色的線條!
我畫綠色的線條!
我畫藍(lán)色的線條!

從簡單工廠模式中可以看出,我們無需暴露出具體的類名(如:RedPen,BluePen,GreenPen...)。只需要告訴調(diào)用者指定字符串,就可以得到相應(yīng)的對象。同時新增其他種類,也都無需修改調(diào)用者的代碼,只要在factory中增加一個判斷就可。

大熊的小作坊生產(chǎn)的彩筆便宜又好用,訂單刷刷的進(jìn)來??墒侵簧a(chǎn)3種顏色的彩筆完全不能滿足市場需求,小朋友們今天突然流行黃色,明天突然流行黑色。大熊每天都要去小作坊升級機器(每天都加判斷),太費時費力了。

簡單工廠模式之所以簡單,就是因為需求的簡單。現(xiàn)在需求的增加,每次都得不停的修改一個工廠的代碼,這已經(jīng)違反了“開-閉原則”,這不是一個好的工廠,需要改革。

2·工廠方法模式(factory method pattern)

為了解決不停的修改原工廠代碼問題,我們需要引入工廠方法模式(進(jìn)一步接耦)。

工廠方法模式的理念就是一個生產(chǎn)類對應(yīng)一個工廠

工廠都是相同類型的工廠,只是以前一個工廠生產(chǎn)n種類型,現(xiàn)在一個工廠只生產(chǎn)一種類型。

大熊的小作坊一條流水線終于變成了獨立的n條流水線。

先規(guī)定好流水線的生產(chǎn)

interface Factory {
   //造個筆,啥顏色,每個流水線自己定
   fun createPen(): Pen
}

引進(jìn)設(shè)備,建造三條流水線

//紅色流水線
class RedPenFactory : Factory {
    //這個流水線造紅色彩筆
    override fun createPen(): Pen {
        return RedPen()
    }
}
//綠色流水線
class GreenPenFactory:Factory{
    //這個流水線造綠色彩筆
    override fun createPen(): Pen {
        return GreenPen()
    }
}
//藍(lán)色流水線
class BluePenFactory : Factory {
    //這個流水線造藍(lán)色彩筆
    override fun createPen(): Pen {
        return BluePen()
    }
}

上線測試

fun main(args: Array<String>) {
    //三條流水線準(zhǔn)備,來生意了
    var redFactory = RedPenFactory()
    var greenFactory = GreenPenFactory()
    var blueFactory = BluePenFactory()

    //各顏色來一批,三條流水線突突突開始生產(chǎn)
    var redPen = redFactory.createPen()
    var greenPen = greenFactory.createPen()
    var bluePen = blueFactory.createPen()

    //驗收,打錢
    redPen.color()
    greenPen.color()
    bluePen.color()
}
-----------------------------------------------
logcat:
我畫紅色的線條!
我畫綠色的線條!
我畫藍(lán)色的線條!

如果我們需要一個yellow的彩筆,只需要定義一個yellowPen,再建造一個yellowPenFactory就OK啦,也不會改動其他流水線的代碼。

結(jié)耦的關(guān)鍵就是1對1的生產(chǎn)關(guān)系,而不是1對多的生產(chǎn)關(guān)系。

現(xiàn)在大熊的小作坊已經(jīng)進(jìn)化成了小工廠,生意蒸蒸日上,錢包越來越鼓~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容