通常所说的工厂模式涉及到 简单工厂模式 , 工厂方法模式和抽象工厂模式。 对于简单工厂模式,理解很简单,把类的实例化的操作通过一个工厂类来操作,实例的使用类尽管使用而不关心对象是如何创建,这样减少了类与类之间的耦合性。相对简单。下面来集中讨论下工厂方法和抽象工厂模式:
工厂方法:定义了一个创建对象的接口,由子类具体去实例化不同的类,把实例化推迟到了子类。 相当于在简单工厂模式中加入了一个工厂接口,这样具体的不同的工厂实现类可以生成不同的类。简单工厂模式工厂类的数量是一个,而工厂方法模式具体的工厂类可以有一个或者多个。
打个比方,
1.简单工厂类就是就好比一座汽车工厂生产汽车,可以根据传入的参数“吉利”、“沃尔沃”、“大众” 不同来生产不同的汽车,此时工厂类仅仅一个。
2. 那工厂方法模式就不同了,他建立了“吉利”、“沃尔沃”、“大众”三座工厂来生产不同牌子的汽车,并且还加入了一个公有的抽象工厂类,除了定义创建抽象的生产方法外还定义这些生产出来的汽车的营销策略、上市日期等等不同牌子汽车的公有属性(可能公有属性的比喻不是十分恰当)。
抽象工厂:提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
情况发生变化,工厂现在针对不同的牌子推出了系列产品:”吉利-A“、”吉利-B“、”吉利-C“、”沃尔沃-A“、”沃尔沃-B“、”沃尔沃-C“、”大众-A“、”大众-B“、”大众-C“。每批次都要相关系列产品。这是就要把不同牌子的汽车抽象出来,比如abstract class 吉利 {} ...
我们再用工厂方法对不同牌子的汽车进行实现,而不同的工厂类可以生产不同的系列产品,比如 吉利的工厂类定义了生产A、B、C全系列的方法
可以这样理解,抽象工厂可以认为是拥有不同生产线的汽车厂,而工厂方法属于其中的一条生产线。
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。