简单工厂模式:
当需要一个相同的接口,但里面完成内容不同时,就可以用一个工厂来产生其中的多个类的一个实例。
通俗说 :用来生产同一等级结构中的任意产品(不支持增加新产品)
在于简单工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
缺点:当需要增加新产品时,需要修改工厂类,不符合开放封闭原则。
工厂方法模式:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方发使用一个类的实例化延迟到其子类。用来生产同一等级结构中的固定产品(支持增加任意产品)
工厂模式中,重要的是工厂类,不是产品类。产品类可以是多种形式的。
工厂方法与简单工厂对比:
1 、工厂方法 除将产品抽象出一个接口以便实现多态,还将不同的工厂进行细分,统一继承自一个接口,将简单工厂中的判断移至客户端。实现了开-闭原则。
2 、客户端若使用一个工厂对象生产多个产品,而简单工厂需要修改每个生产函数的参数,工厂方法模式只需修改初始化语句。
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。
用来生产不同产品族的全部产品,易于交换产品系列。(对于增加新产品,无能为力,支持增加产品族)。
一个产品族是不同系列的产品组合,产品的创建的逻辑分在每个具体的工厂中。所有的具体工厂继承自同一个抽象工厂。客户端创建不同产品族的工厂,产品族的工厂创建具体的产品,但对客户端是不可见的。
工厂方法模式是简单工厂的抽象加深,它不需要一个独立来创建对象。而是通过子类延迟创建需要的对象。如在汽车的对象里面包括了发动机对象,但发动机对象不是由特定的工厂类来产生,而是取决于到底是什么样的汽车,不同的汽车有不同的发动机对象,这就是交给了子类来完成。
而抽象工厂则有点类似 简单工厂模式 + 工厂方法模式。 它的好处是通过抽象类来隔离具体类,并通过唯一入口来决定产生什么具体类。我们使用它的前提条件是一系列相似的类。