简单工厂模式

作者: Grasse | 来源:发表于2017-11-12 23:00 被阅读0次

    有一种抽象产品——汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar。

    作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下

    此时如果要改为开Land Rover,则需要修改代码,创建Land Rover的实例并执行其drive方法。这也就意味着任何时候需要换一辆车开的时候,都必须修改客户端代码。

    一种稍微好点的方法是,通过读取配置文件,获取需要开的车,然后创建相应的实例并由父类Car的引用指向它,利用多态执行不同车的drive方法。如下

    对于Car的使用方而言,只需要通过参数即可指定所需要Car的各类并得到其实例,同时无论使用哪种Car,都不需要修改后续对Car的操作。至此,简单工厂模式的原型已经形成。如果把上述的逻辑判断封装到一个专门的类的静态方法中,则实现了简单工厂模式。工厂代码如下

    与Driver2相比,所有的判断逻辑都封装在工厂(CarFactory1)当中,Driver3不再需要关心Car的实例化,实现了对象的创建和使用的隔离。

    当然,简单工厂模式并不要求一定要读配置文件来决定实例化哪个类,可以把参数作为工厂静态方法的参数传入。

    简单工厂模式进阶

    使用反射实现扩展性

    从Driver2和CarFactory1的实现中可以看到,当有新的车加入时,需要更新Driver2和CarFactory1的代码也实现对新车的支持。这就违反了开闭原则(Open-Close Principle)。可以利用反射(Reflection)解决该问题。

    从上面代码中可以看到,之后如果需要引入新的Car,只需要在配置文件中指定该Car的完整类名(包括package名),CarFactory2即可通过反射将其实例化。实现了对扩展的开放,同时保证了对修改的关闭。熟悉Spring的读者应该会想到Spring IoC的实现。

    具体PPT请看 PPT

    问题

    1.三种工厂模式的区别?

    简单工厂:用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

    工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

    抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

    2.什么时候使用简单工厂模式?

    (1)编译时无法准备预期要创建的对象的类

    (2)类想让其子类决定在运行时创建什么

    (3)类有若干辅助类为子类,而你想将返回哪个子类这一信息局部化

    3.简单工厂的缺点?

    简单工厂主要违反了开闭原则:对扩展开放,对修改关闭。添加一种对象,就要去修改简单工厂中的获取对象方法。

    视频请看     视频

    相关文章

      网友评论

        本文标题:简单工厂模式

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