工厂模式--个体户的进化之路(下)
2019-06-14 本文已影响1人
space0o0
抽象工厂模式
大熊的彩笔工厂生意蒸蒸日上,经过工厂方法模式的改进,现在已经有红色流水线,绿色流水线,蓝色流水线等等。每个流水线生产相应颜色的彩笔。
市场总监打算拓宽市场,增加产品品类,提高利润。
开会决定:每条流水线再生产相同颜色的橡皮,和彩笔捆绑销售。
现在每个factory的工作就不止createPen()(生产彩笔)了,还需要createEraser()(生产橡皮)。
我们先制定橡皮的种类
interface Eraser {
//彩笔的外观
fun display()
}
再搞一批橡皮的类(这里为了省事就用两种颜色了)
class RedEraser : Eraser {
override fun display() {
println("红色的橡皮")
}
}
class GreenEraser : Eraser {
override fun display() {
println("绿色的橡皮")
}
}
现在每一条流水线需要增加功能,改进机器的生产种类
interface IFactory {
//生产彩笔
fun createPen(): Pen
//生产橡皮
fun createEraser(): Eraser
}
每个流水线就得相应的增加生产橡皮的功能
//红色生产线,全套红色的彩笔和橡皮
class RedFactory : IFactory {
override fun createPen(): Pen {
return RedPen()
}
override fun createEraser(): Eraser {
return RedEraser()
}
}
//绿色生产线,全套绿色的彩笔和橡皮
class GreenFactory : IFactory {
override fun createPen(): Pen {
return GreenPen()
}
override fun createEraser(): Eraser {
return GreenEraser()
}
}
这下我们的流水线进化完成,它们可以生产相同颜色的彩笔和橡皮了。
//来订单了
fun main(args: Array<String>) {
//红色红色,给我来一批
var factory: IFactory = RedFactory()
//红色生产线开始生产彩笔和橡皮
var redPen = factory.createPen()
var redEraser = factory.createEraser()
//绿色绿色,你也来一批
factory = GreenFactory()
var greenPen = factory.createPen()
var greenEraser = factory.createEraser()
println("红色套餐:${redPen.color()} 搭配 ${redEraser.display()}")
println("绿色套餐:${greenPen.color()} 搭配 ${greenEraser.display()}")
}
-----------------------------------------------
logcat:
红色套餐:我画红色的线条! 搭配 红色的橡皮
绿色套餐:我画绿色的线条! 搭配 绿色的橡皮
抽象工厂模式的引入,让我们的具体工厂可以实现多个接口,生成多个产品。
抽象工厂模式其实和工厂方法模式很类似,只是扩展了工厂的具体实现,一个工厂现在可以生产一系列的产品。
示例图:

抽象工厂模式的缺点可能就在于它的扩展性上,每次需要增加一个产品系列,我就需要修改IFactory接口和具体的Factory实现类。在这种情况下,或许使用简单工厂模式,能快速扩展,也能保持代码的易读性。
所以在扩展性和易读性上,我们选择的设计模式也需要根据业务和实际情况进行取舍。并不是越高级越抽象的模式,就一定是最好的。
大道至简,写出易读,易扩展的代码,才是设计模式存在的意义。