创建型模式之抽象工厂模式
一、抽象工厂模式简介
抽象工厂模式定义了一组接口,用来创建一系列相关或者相互依赖的对象。从这个定义中我们可以看出,抽象工厂最终一定是创建出来多个对象,而着多个对象是具有依赖关系或者相关性的
二、抽象工厂的使用场景
如果我们需要创建一组相关的产品,而这组相关的产品可能有多种组合实现,那么我们就需要使用抽象工厂
2.1 杯子案例场景
需求:现在公司A需要生产一种新的水杯用来吸引顾客,水杯的杯身形状和杯盖形状有多种可以选择,目前拟定的杯盖和杯身有如下三种形状:圆筒形、长方形,考虑到初次尝试,公司A决定,只将相同形状样式风格的杯身和杯盖组合在一起,因此产生了如下三种具体的水杯产品:圆筒形杯盖+圆筒形杯身、长方形杯盖+长方形杯身、椭圆形杯盖+椭圆形杯身。
2.2 杯子案例场景分析
通过上述的场景描述我们可以抽象出如下实体类:
(1)杯子,这是公司A最终需要生产出来的产品
(2)不同样式的杯盖
(3)不同样式的杯身
如果公司A决定找一家工厂做代加工,那么很明显,这家工厂只需要能够同时生产不同形状的杯盖和不同形状的杯身即可(在这个案例中是至少两种形状),公司A在拿到杯盖和杯身等原材料之后,只需要进行材料组合即可完成杯子的生产,作为代加工的工厂,为了避免生产出来的不同的形状的杯盖混合在一起,以及不同形状的杯身混合在一起,分拣困难,代加工工厂,只需要将生产线划分为两类,第一类只负责生产圆形的杯盖和圆形的杯身,第二类则只负责生产矩形的杯盖和矩形的杯身,这样在交付的时候,就免去了分拣的工作
三、抽象工厂模式的类图结构
3.1 类图组件
- 抽象工厂,抽象工厂提供了一组相关的接口,每一个接口对应一种产品的创建
- ConcreteFactory1和ConcreteFactory2是两个具体工厂,这两个具体工厂实现了抽象工厂中的方法,具体工厂负责具体产品的创建,但是不同的具体工厂负责组装不同风格的产品,比如ConcreteFactory1,就负责组装A产品的1型号和B产品的1型号
- AbstractProductA和AbstractProductB是两个抽象的产品,抽象产品由具体的产品类进行实现
- ProductA1和ProductA2,是A系列产品的两种不同的型号,同理ProductB1和ProductB2是B系列产品的两种不同的型号
- Client,Client使用抽象工厂创建产品A和产品B的组合
四、使用抽象工厂实现杯子案例场景
根据抽象工厂的类图结构和案例场景分析,我们可以得出如下对应关系,抽象工厂对应的就是我们的代加工工厂,而具体的子工厂对应的就是代加工工厂中根据类别划分出来的不同的流水线,抽象的产品就是杯盖和杯身,而具体的产品就是不同形状的杯盖和杯身
4.1 杯子组件抽象工厂实现
package cupdesign;
public abstract class AbstractCupFactory {
public abstract AbstractCupLid createCupLid();
public abstract AbstractCupBody createCupBody();
}
4.2 圆形风格的杯子组件具体工厂实现
package cupdesign;
public class RoundCupFactory extends AbstractCupFactory {
@Override
public AbstractCupLid createCupLid() {
return new RoundCupLid();
}
@Override
public AbstractCupBody createCupBody() {
return new RoundCupBody();
}
}
4.3 矩形风格的杯子组件具体工厂实现
package cupdesign;
public class RectangularCupFactory extends AbstractCupFactory {
@Override
public AbstractCupLid createCupLid() {
return new RectangularCupLid();
}
@Override
public AbstractCupBody createCupBody() {
return new RectangularCupBody();
}
}
4.4 抽象杯盖和杯身
package cupdesign;
public abstract class AbstractCupLid {
protected String shape;
public String getShape() {
return shape;
}
}
package cupdesign;
public abstract class AbstractCupBody {
protected String shape;
public String getShape() {
return shape;
}
}
4.5 圆形杯盖和杯身
package cupdesign;
public class RoundCupLid extends AbstractCupLid {
public RoundCupLid() {
shape = "round";
}
}
package cupdesign;
public class RoundCupBody extends AbstractCupBody {
public RoundCupBody() {
shape = "round";
}
}
4.6 矩形杯盖和杯身
package cupdesign;
public class RectangularCupLid extends AbstractCupLid {
public RectangularCupLid() {
shape = "rectangular";
}
}
package cupdesign;
public class RectangularCupBody extends AbstractCupBody {
public RectangularCupBody() {
shape = "rectangular";
}
}
五、抽象工厂设计模式总结
-
抽象工厂的基本功能
抽象工厂可以帮助我们创建一组不同风格的产品,至于抽象工厂创建的是哪种风格的产品,取决于具体的抽象工厂子类,这里需要注意的是,抽象工厂只是负责创建不同风格的产品,并不是完全不同的产品,通过抽象工厂创建出来的产品最终一定能归结为某类产品,只是这类产品具有多种可能的风格而已
-
抽象工厂中几个重要的组件
(1)抽象工厂类,在该类中需要定义一组接口,每一个接口和一个具体的产品相对应,从这个层面上看,也可以理解为抽象工厂将一组相关的产品给组合起来了,这其实也对应着抽象工厂的定义
(2)具体的工厂类,具体的工厂类负责创建具体的产品对象,不同的具体工厂,负责创建不同风格的对象
(3)抽象产品和具体的产品