美文网首页
辨析简单工厂,工厂方法和抽象工厂

辨析简单工厂,工厂方法和抽象工厂

作者: pepsi1000 | 来源:发表于2019-08-07 17:26 被阅读0次

    1. 简单工厂

    只是一种编码风格,不属于设计模式。查看wikipedia解释

    由一个工厂对象负责创建具体的产品,将客户端与产品解耦合。

    缺点:拓展性差。增加新产品时,无法形成继承的等级结构,需要通过修改工厂类的判断逻辑,违背了开闭原则,而工厂方法解决了简单工厂对于同一等级的产品拓展性差的缺点。

    适用场景:简单工厂的缺点决定了其只适用于创建的产品对象比较少的情况下。

    源码案例

    • calendar#getInstance#createGalendar 值得注意的是,这是个静态方法,也就是说这个方法并不考虑产品的拓展性,因此使用简单工厂最恰当。

    2. 工厂方法

    将创建产品的职能延迟到子类。解决了简单工厂拓展性差的问题。

    理解产品等级和产品族。(产品族是抽象工厂中的概念)

    解决同一产品等级的业务抽象问题。

    源码案例

    • collection#iterator TODO iterator UML配图。

    其它

    什么时候选择使用抽象类而不是接口?

    某些属性,行为是已知的情况下,使用抽象类更合适。

    3. 抽象工厂

    产品等级和产品族,举例说明:

    • 美的空调,格力空调,海尔空调属于同一产品等级。

    • 美的空调,美的电冰箱,美的电视属于同一产品族。

    工厂方法和抽象工厂差别在于关注点不同。工厂方法关注同一产品等级拓展差的问题,而抽象工厂关注同一产品族拓展性的问题。

    让我们继续从拓展产品等级和拓展产品族这两个维度切入分析:

    拓展产品等级:

    • 工厂方法:新增产品实现类、产品工厂实现类,符合开闭原则。

    • 抽象工厂:需要修改抽象工厂接口,违反开闭原则。

    拓展产品族:(增加同族产品)

    • 工厂方法:新增产品工厂违反高内聚低耦合,修改原来产品工厂违反开闭原则。

    • 抽象工厂:新增产品工厂实现、新增产品1、新增产品2等,符合开闭原则。(注意:产品1和产品2属于不同的产品类型)

    源码案例

    • connection 抽象工厂,mysql的connectionimpl属于抽象工厂的具体实现。

    • sqlsessionfactory 其中sqlsession和configuration属于同一产品族,defaultsqlsessionfactory就是其中一个抽象工厂的具体实现。

    4. 总结

    简单工厂,工厂方法和抽象工厂的最大区别在于关注点不同:

    • 简单工厂关注将客户端与产品解耦合。

    • 工厂方法关注产品等级的拓展性。

    • 抽象工厂关注产品族的拓展性。

    相关文章

      网友评论

          本文标题:辨析简单工厂,工厂方法和抽象工厂

          本文链接:https://www.haomeiwen.com/subject/hfjadctx.html