美文网首页
工厂方法模式(Factory Method)

工厂方法模式(Factory Method)

作者: 小丸子的呆地 | 来源:发表于2021-07-06 00:51 被阅读0次

    工厂方法模式(Factory Method),属于创建型模式,定义一个用与创建对象的接口,让子类决定实例化拿一个类。工厂方法使一个类的实例化延迟到其子类。


    工厂方法模式UML

    简单工厂 vs 工厂方法

    简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据用户的选择条件动态实例化对应的类,对于用户来说,去除了具体产品的依赖。

    • 简单工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
    • 违背“开放 - 封闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
    • 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

    工厂方法实现时,需要用户决定实例化拿一个工厂来实现具体产品,选择判断依然存在,也就是说工厂方法把简单工厂内部的逻辑判断转移到了用户侧。

    • 解决了简单工厂上述的一些缺点。

    缺点

    • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;
    • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
    • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类;
    • 一个具体工厂只能创建一种具体产品

    应用

    • 当一个类不知道它所需要的对象的类时
      在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
    • 当一个类希望通过其子类来指定创建对象时
      在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
    • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

    案例

    Spring中的FactoryBean,就是使用工厂方法模式。

    相关文章

      网友评论

          本文标题:工厂方法模式(Factory Method)

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