大熊家里拆迁了,终于不用当房产中介了,熊爸熊妈拿出一部分钱来让大熊去做生意
大熊决定开一个彩笔厂,生产五颜六色的彩笔给小朋友。ps:大熊是菜逼,所以要从头开始学习。
大熊就想着先建一个简单的工厂呗,做些最基础的彩笔
1·简单工厂模式
先定个接口,声明下彩笔应该是啥样的
interface Pen {
//定义一堆彩笔的属性,先来个颜色,其他再说。。。
//颜色
fun color()
}
然后定义一堆彩笔
//红色的彩笔
class RedPen : Pen {
override fun color() {
println("我画红色的线条!")
}
}
//绿色的彩笔
class GreenPen: Pen {
override fun color() {
println("我画绿色的线条!")
}
}
//蓝色的彩笔
class BluePen : Pen {
override fun color() {
println("我画蓝色的线条!")
}
}
大熊设计好了彩笔后,就需要建造个家庭小作坊来生产了
//彩笔小作坊工厂(简单工厂模式)
class EasyPenFactory {
companion object {
@JvmStatic
fun createPen(color: String): Pen {
var newPen: Pen = RedPen()//默认生产红色
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:
我画红色的线条!
我画绿色的线条!
我画蓝色的线条!
从简单工厂模式中可以看出,我们无需暴露出具体的类名(如:RedPen,BluePen,GreenPen...)。只需要告诉调用者指定字符串,就可以得到相应的对象。同时新增其他种类,也都无需修改调用者的代码,只要在factory中增加一个判断就可。
大熊的小作坊生产的彩笔便宜又好用,订单刷刷的进来。可是只生产3种颜色的彩笔完全不能满足市场需求,小朋友们今天突然流行黄色,明天突然流行黑色。大熊每天都要去小作坊升级机器(每天都加判断),太费时费力了。
简单工厂模式之所以简单,就是因为需求的简单。现在需求的增加,每次都得不停的修改一个工厂的代码,这已经违反了“开-闭原则”,这不是一个好的工厂,需要改革。
2·工厂方法模式(factory method pattern)
为了解决不停的修改原工厂代码问题,我们需要引入工厂方法模式(进一步接耦)。
工厂方法模式的理念就是一个生产类对应一个工厂
工厂都是相同类型的工厂,只是以前一个工厂生产n种类型,现在一个工厂只生产一种类型。
大熊的小作坊一条流水线终于变成了独立的n条流水线。
先规定好流水线的生产
interface Factory {
//造个笔,啥颜色,每个流水线自己定
fun createPen(): Pen
}
引进设备,建造三条流水线
//红色流水线
class RedPenFactory : Factory {
//这个流水线造红色彩笔
override fun createPen(): Pen {
return RedPen()
}
}
//绿色流水线
class GreenPenFactory:Factory{
//这个流水线造绿色彩笔
override fun createPen(): Pen {
return GreenPen()
}
}
//蓝色流水线
class BluePenFactory : Factory {
//这个流水线造蓝色彩笔
override fun createPen(): Pen {
return BluePen()
}
}
上线测试
fun main(args: Array<String>) {
//三条流水线准备,来生意了
var redFactory = RedPenFactory()
var greenFactory = GreenPenFactory()
var blueFactory = BluePenFactory()
//各颜色来一批,三条流水线突突突开始生产
var redPen = redFactory.createPen()
var greenPen = greenFactory.createPen()
var bluePen = blueFactory.createPen()
//验收,打钱
redPen.color()
greenPen.color()
bluePen.color()
}
-----------------------------------------------
logcat:
我画红色的线条!
我画绿色的线条!
我画蓝色的线条!
如果我们需要一个yellow的彩笔,只需要定义一个yellowPen,再建造一个yellowPenFactory就OK啦,也不会改动其他流水线的代码。
结耦的关键就是1对1的生产关系,而不是1对多的生产关系。
现在大熊的小作坊已经进化成了小工厂,生意蒸蒸日上,钱包越来越鼓~
网友评论