前面我们分别介绍了简单工厂模式工厂方法模式抽象工厂模式,那么它们到底有什么区别呢? 下面我们根据前面列举的生产手机的例子进行对比说明。

简单工厂

简单工厂模式其实不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 简单工厂模式的意图是定义一个类来负责创建其他类的实例,并且被创建的实例通常都具有共同的父类. Creates objects without exposing the instantiation logic to the client.Refers to the newly created object through a common interface

Simple Factory
Simple Factory
在上面的示例图中我们可以看出简单工厂模式的核心就是PhoneFactory类,它有个静态的makePhone方法,接收Client传递的参数,然后根据不同的参数生产出不同的手机。

工厂方法

而工厂方法的意图是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 Factory Method: Define an interface for creating an object,but let subclass decide which class to instantiate.Factory Method lets a class defer instantiation to subclass.

Simple Factory
Simple Factory

在上面的示例图中,虽然我们也有PhoneFactory,但与简单工厂中的PhoneFactory,在工厂方法中它是一个抽象类或接口,而且makePhone方法也是抽象的。与简单工厂不同的是,我们还新建了两个具体的AppleFactorySamsungFactory,它们都是PhoneFactory的具体实现。这样当Client需要生产手机时,先获取的是具体的手机工厂的引用,然后再调用makePhone方法生产手机。

抽象工厂

Abstract Factory Pattern:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

Simple Factory
Simple Factory
从上面的图示可以看出抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。它与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类

工厂方法和抽象工厂的区别如下表:

Factory MethodAbstract Factory
针对的是一个产品等级结构针对的是面向多个产品等级结构
一个抽象产品类多个抽象产品类
可以派生出多个具体产品类每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例每个具体工厂类可以创建多个具体产品类的实例

所以从产品数量上来说,工厂方法和抽象工厂的区别是单一与多个:

Differences1
Differences1

从产品结构上来说,工厂方法针对的是一个产品等级结构,而抽象工厂针对的是面向多个产品等级结构或者说创建一组相关或者相互依赖的产品。

Differences2
Differences2