抽丝剥茧设计模式-工厂和抽象工厂模式

换了写作方式,问答和推导的叙述方式更有利于读者理解和学习。

 

一、什么是工厂模式?
  任何可以产生对象的方法或类,都可以称之为工厂模式。其实从一定角度来说单例模式也是工厂模式。
  不可咬文嚼字,不必纠结概念,真正学好设计模式,会让你达到到手中无剑,心中有剑的境界。

二、为什么明明可以new对象,还要有工厂?
  (1)灵活控制生产过程;
  (2)加权限、修饰、日志等操作;
  (3)不需要关注复杂对象创建过程;


三、实际应用场景?
  (1)Hibernate 换数据库只需换方言和驱动就可以。
  (2)Spring


四、一步步推到,请思考以下需求:
  (1)任意定制交通工具(继承Vehicle类)
  (2)任意定制生产过程(继承Vehicle类,VehicleFactory.create())
  (3)任意定制产品族(抽象工厂)
实现:
  一个工厂设计模式需求,不用工厂设计模式或者用其它设计模式也能实现,我们要做的是选一种更好的方式实现。这个好的评价标准就是设计模式需要遵守的6大原则。例如其中的开闭原则,在实现需求的时候避免修改原来的类、方法。

  (1)简单工厂、静态工厂:
    Car CarFactory
    假如扩展公交车,增加 Bus BusFactory
    缺点:每次增加一个产品,都要增加一个具体类和生产对象的工厂类。
  (2)工厂
    Car Bus SimpleVehicleFactory
    假如扩展飞机,增加Plan、在SimpleVehicleFactory中增加createPlan方法即可
    缺点:每次增加一个产品,都要增加一个具体类,在生产对象的工厂类中增加create()方法。
  (3)抽象工厂
    AbstractFactory
      VehicleFactory
        Vehicle(Car、Bus、Plan、Broom)
      FoodFactory
        Food(Bread、Mushroom)
      MagicFactory
        Weapon(AK47、MagicStick)
    假如扩展魔法族产品,增加weapon和MagicFactory即可
    缺点:要增加一个系列的某一产品,既要在AbstractFactory加create(),又要在具体实现的Factory中加create()。

五、为什么工厂模式用的是接口interface,而抽象工厂模式用的是抽象类abstract class?
  语法上,接口和抽象类均可以。从语义上理解,概念真实存在用抽象类,强调属性用接口,名词用抽象类,形容词用接口。

六、Factory Pattern 和 Abstract Factory Pattern的区别?
  工厂方法适合产品扩展,想增加新产品,就创建新的工厂即可。
  抽象工厂适合产品族扩展,不适合产品扩展,扩展需要加方法,改代码。

感谢阅读到现在,请在留言区提出宝贵的意见!

更多精彩内容,关注微信公众号:技术严选

posted @ 2021-08-19 10:36  YolandaRay  阅读(64)  评论(0编辑  收藏  举报