大熊家里拆遷了,終于不用當(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)化成了小工廠,生意蒸蒸日上,錢包越來越鼓~