zoukankan      html  css  js  c++  java
  • 抽丝剥茧设计模式-工厂和抽象工厂模式

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

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

    二、为什么明明可以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的区别?
      工厂方法适合产品扩展,想增加新产品,就创建新的工厂即可。
      抽象工厂适合产品族扩展,不适合产品扩展,扩展需要加方法,改代码。

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

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

  • 相关阅读:
    VB.Command()的参数
    XAMPP 启动mysql报错 InnoDB: Error: could not open single-table tablespace file……
    在不安装Windows服务的情况下,如何进行调试或测试
    Java基础东西(按位操作运算)
    浅谈web应用的负载均衡、集群、高可用(HA)解决方案
    关于CSDN, cnblog, iteye和51cto四个博客网站的比较与分析
    bzoj2243[SDOI2011]染色
    洛谷P2740 [USACO4.2]草地排水Drainage Ditches
    bzoj4198[noi2015]荷马史诗
    矩阵快速幂模板(pascal)
  • 原文地址:https://www.cnblogs.com/wscl/p/15160599.html
Copyright © 2011-2022 走看看