工厂模式属于创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
1. 简单工厂模式
该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,使用参数驱动,其UML类图如下:
我们使用手机的生产举例,Factor是一个手机生产的代工厂,可以产生Product1(小米手机),也可以产生Product2(华为手机),客户端想要产生设么样的手机,可以把参数传递给代工厂Factory,Factory根据客户传递的参数,生产对应的产品。所以简单工厂的特性就是工厂唯一,产品多样性。
2. 工厂方法模式(Factory Method)
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
还是用手机的生产举例,小米要产生不同系列的产品,比如小米10,小米11,华为也要生产不同系列的产品,比如V20,V30等,那么就不同工厂产生不同品牌的手机吧,Factor1负责产生华为手机,factor2负责产生小米手机,
3. 抽象工厂模式(Abstract Factory)
上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。其UML类图如下:
从上面类图结构中可以清楚的看到如何在工厂方法模式中通过增加新产品接口来实现产品的增加的。接下来我们继续通过小米和苹果产品生产的例子来解释该模式。为了弄清楚上面的结构,我们使用具体的产品和工厂来表示上面的UML类图,能更加清晰的看出模式是如何演变。