抽象工厂模式(Abstract Factory Pattern):
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。(Provide an interface for creating families of related or dependent object without specifying their concrete classes.)
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
工厂方法是在解决一个产品多个层级方面的事情;而抽象工厂致力于解决多个产品多个层级方面的事情。举个例子:汽车是由很多零件组成的,比如轮胎、方向盘等等。
举个例子:汽车是由很多零件组成的,比如轮胎、方向盘等等。现在如果我们是轮胎生产方,要生产宝马轮胎和奔驰轮胎,要用工厂方法还是抽象工厂实现呢?答案是:工厂方法。轮胎是一个产品,宝马轮胎和奔驰轮胎是 2 个不同层级的轮胎,所以用工厂方法解决就足够。假如现在我们是汽车生产方,要生产宝马汽车和奔驰汽车,汽车又包含轮胎和方向盘等等,要用哪个来实现?既然是上面的是工厂方法,那这个就用抽象工厂,因为这涉及到多个产品(轮胎、方向盘等等)和 2 个层级(宝马和奔驰)。
上面定义中:为创建一组相关或相互依赖的对象提供一个接口。这样子理解这句话,比如上面说的轮胎和方向盘,宝马汽车用的轮胎和方向盘需要都是宝马品牌的,也就是说在安装宝马汽车的轮胎和方向盘的时候,得用宝马生产的轮胎和方向盘,重要的一点是:轮胎和方向盘是互相依赖的,不能在宝马汽车上安装奔驰轮胎和宝马方向盘,因为有这个依赖关系,所以我们需要提供一个额外的接口,来保证宝马汽车使用的轮胎和方向盘都是宝马生产的。这就是抽象工厂干的事情。
案例可以分为以下4步:
第一步:创建抽象汽车工厂接口,宝马工厂和奔驰工厂实现这个接口。
//抽象汽车工厂接口
public interface AbstractCarFactory {
void installWheel();
void installSteeringWheel();
}
//宝马工厂
class BMWCarFactory implements AbstractCarFactory {
@Override
public void installWheel() {
BMWWheelFactory bmwWheelFactory = new BMWWheelFactory();
String wheel = bmwWheelFactory.createWheel();
System.out.println("安装轮胎:"+wheel);
}
@Override
public void installSteeringWheel() {
BMWSteeringWheelFacatory bmwSteeringWheelFacatory = new BMWSteeringWheelFacatory();
String steeringWheel = bmwSteeringWheelFacatory.createSteeringWheel();
System.out.println("安装方向盘:" + steeringWheel);
}
}
//奔驰工厂
class MercedesCarFacatory implements AbstractCarFactory {
@Override
public void installWheel() {
MercedesWheelFactory mercedesWheelFactory = new MercedesWheelFactory();
String wheel = mercedesWheelFactory.createWheel();
System.out.println("安装轮胎:"+wheel);
}
@Override
public void installSteeringWheel() {
MercedesSteeringWheelFacatory mercedesSteeringWheelFacatory = new MercedesSteeringWheelFacatory();
String steeringWheel = mercedesSteeringWheelFacatory.createSteeringWheel();
System.out.println("安装方向盘:" + steeringWheel);
}
}
第二步:创建轮胎工厂接口,宝马轮胎工厂和奔驰轮胎工厂实现这个接口。
//轮胎工厂接口
public interface WheelFacatory {
String createWheel();
}
//宝马轮胎工厂
class BMWWheelFactory implements WheelFacatory {
@Override
public String createWheel() {
System.out.println("宝马轮胎工厂生产轮胎");
return "宝马轮胎";
}
}
//奔驰轮胎工厂
class MercedesWheelFactory implements WheelFacatory {
@Override
public String createWheel() {
System.out.println("奔驰轮胎工厂生产轮胎");
return "奔驰轮胎";
}
}
第三步:创建方向盘工厂接口,宝马方向盘工厂和奔驰方向盘工厂实现这个接口。
//方向盘工厂接口
public interface SteeringWheelFacatory {
String createSteeringWheel();
}
//宝马方向盘工厂
class BMWSteeringWheelFacatory implements SteeringWheelFacatory{
@Override
public String createSteeringWheel() {
System.out.println("宝马方向盘工厂生产方向盘");
return "宝马方向盘";
}
}
//奔驰方向盘工厂
class MercedesSteeringWheelFacatory implements SteeringWheelFacatory{
@Override
public String createSteeringWheel() {
System.out.println("奔驰方向盘工厂生产方向盘");
return "奔驰方向盘";
}
}
第四步:测试类
//测试
public class AbstractFactoryTest {
public static void main(String[] args) {
// 宝马员工安装轮胎和方向盘
BMWCarFactory bmwCarFactory = new BMWCarFactory();
bmwCarFactory.installWheel();
bmwCarFactory.installSteeringWheel();
// 奔驰员工安装轮胎和方向盘
MercedesCarFacatory mercedesCarFacatory = new MercedesCarFacatory();
mercedesCarFacatory.installWheel();
mercedesCarFacatory.installSteeringWheel();
}
}
测试结果如下图所示:
如果想了解更多设计模式,可点击:设计模式概述 以及 23种设计模式的介绍