工厂模式--个体户的进化之路(下)

接上篇:工厂模式--个体户的进化之路(上)

抽象工厂模式

大熊的彩笔工厂生意蒸蒸日上,经过工厂方法模式的改进,现在已经有红色流水线,绿色流水线,蓝色流水线等等。每个流水线生产相应颜色的彩笔。

市场总监打算拓宽市场,增加产品品类,提高利润。

开会决定:每条流水线再生产相同颜色的橡皮,和彩笔捆绑销售。

现在每个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) {

    //红色红色,给我来一批
    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:
红色套餐:我画红色的线条!  搭配  红色的橡皮
绿色套餐:我画绿色的线条!  搭配  绿色的橡皮

抽象工厂模式的引入,让我们的具体工厂可以实现多个接口,生成多个产品。

抽象工厂模式其实和工厂方法模式很类似,只是扩展了工厂的具体实现,一个工厂现在可以生产一系列的产品。

示例图:

工厂模式--个体户的进化之路(下)_第1张图片
图.png

抽象工厂模式的缺点可能就在于它的扩展性上,每次需要增加一个产品系列,我就需要修改IFactory接口和具体的Factory实现类。在这种情况下,或许使用简单工厂模式,能快速扩展,也能保持代码的易读性。

所以在扩展性和易读性上,我们选择的设计模式也需要根据业务和实际情况进行取舍。并不是越高级越抽象的模式,就一定是最好的。

大道至简,写出易读,易扩展的代码,才是设计模式存在的意义。

你可能感兴趣的:(工厂模式--个体户的进化之路(下))