首先三者都属于设计模式中的同一类型:对象创建型,先列举三者的定义:
简单工厂模式(非GoF模式)
简单工厂模式实际上就是通过向工厂类传入相应产品类的参数,动态决定应该创建哪一个具体的产品类实例。
图例如下:
适用的场景为:需要创建的对象较少;调用者只能提供创建对象所需的参数,而不关心创建逻辑;由于大量不同类对象需要提供的参数更多,因此为了不过多地增加系统的偶合性,一般只在很简单的情况下应用。
工厂方法模式
工厂方法模式是定义一个用于创建对象的接口,让子类决定实例化哪一个具体的产品类。它使一个产品类的实例化延迟到其子类中。
图例如下:
适用的场景为:当一个类不知道所要创建对象的类时;当一个类希望由它的子类来指定所创建的对象时;当类将创建对象的职责委托给多个帮助子类的某一个,并且希望这个子类代理这一局部的时候。
抽象工厂模式
抽象工厂模式定义是提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。其实它也可以简单地看作工厂方法的加强版。图例如下:
适用的场景为:一个系统要独立于它的产品的创建、组合和表示时;一个系统要由多个产品系列中的一个来配置时;当要够高一系列相关的产品对象的设计以便进行联合使用时;当提供一个产品类库,而只想显示它们的接口而不是实现时。
总结:从以上三者的定义来看,模式的使用者Client都只需要关心抽象的工厂类或者抽象的产品类,而把创建何种产品的问题交给工厂类(或其子类)解决,这样就大大增加了系统的的灵活性。三者的不同点,由以上三图也可明显得出:简单工厂模式是通过工厂类自身接受其调用者Client传入的参数来判断创建何种产品,工厂方法模式则用到了面向对象中的继承特性,通过继承抽象类的方法,将产品的创建延迟到子类中实现,抽象工厂模式原理与工厂方法模式相同,只是这里关注的是创建一系列相关或者相互依赖的对象。