1. 介绍
1.1 定义
抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
1.2 主要作用
允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
1.3 解决的问题
每个工厂只能创建一类产品
即工厂方法模式的缺点
2.业务场景
抽象工厂模式是三种工厂模式中最为复杂的一个,其关键在于品牌家族的概念,这里的一个工厂要生产某一个品牌家族里面的系列产品。
下图为具体案例的UML图
图中有两个产品家族 小米公司 和 苹果公司 ,每个产品家族中包含两种产品,笔记本电脑与手机。
所以需要两个工厂。XiaoMiFactory 与AppleFactory,他们都实现抽象工厂接口AbstractFactory。
XiaoMiFactory生产MiComputer和MiPhone,AppleFactory生产MacComputer和IPhone。
其中MiComputer和MacComputer是同一类型的产品,都是笔记本电脑,实现同一个接口Computer。
其中MiPhoto和IPhoto是同一类型的产品,都是手机,实现同一个接口MobilePhoto。
使用抽象工厂模式
第一步:定义一个电脑的抽象基类,里面有一个为电脑安装操作系统的抽象方法。
//电脑接口
public abstract class Computer {
public abstract void setOperationSystem();
}
public class MacComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("Mac笔记本安装Mac系统");
}
}
public class MiComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("小米笔记本安装Win10系统");
}
}
第二步:定义一个手机的抽象基类,里面有一个为手机安装操作系统的抽象方法。
//手机接口
public abstract class MobilePhone {
public abstract void setOperationSystem();
}
public class IPhone extends MobilePhone {
@Override
public void setOperationSystem() {
System.out.println("苹果手机安装IOS系统");
}
}
public class MiPhone extends MobilePhone {
@Override
public void setOperationSystem() {
System.out.println("小米手机安装Android系统");
}
}
第三步:定义工厂类,这里的工厂不是按照具体的产品类型定义,而是按照品牌家族来定义。
例如现在有两个品牌小米和苹果,那么就需要分别为这两个品牌各定义一个工厂,每个工厂生产这个品牌家族的系列产品,例如笔记本电脑和手机。
//抽象工厂接口
public interface AbstractFactory {
Computer makeComputer();
MobilePhoto makeMobilePhone();
}
public class AppleFactory implements AbstractFactory {
@Override
public Computer makeComputer() {
return new MacComputer();
}
@Override
public MobilePhoto makeMobilePhone() {
return new IPhone();
}
}
public class XiaoMiFactory implements AbstractFactory {
@Override
public Computer makeComputer() {
return new MiComputer();
}
@Override
public MobilePhoto makeMobilePhone() {
return new MiPhone();
}
}
第四步:使用工厂来生产产品,这里每个工厂生产的是那个品牌家族的一系列产品,而不是一个。
public static void main(String[] args) {
//使用苹果工厂生产苹果公司的系列产品
AbstractFactory appleFactory=new AppleFactory();
appleFactory.makeComputer().setOperationSystem();
appleFactory.makeMobilePhone().setOperationSystem();
//使用小米工厂生产小米公司的系列产品
AbstractFactory miFactory=new XiaoMiFactory ();
miFactory.makeComputer().setOperationSystem();
miFactory.makeMobilePhone().setOperationSystem();
}
理解抽象工厂模式的核心关键在于理解品牌家族的概念,简单工厂方法与工厂方法创建工厂的着眼点为某类具体的产品,某个工厂与某个产品对应,而抽象工厂某个工厂与产品的家族对应,这个工厂可以生产这个品牌家族的一系列产品。
抽象工厂模式技术要点总结
- 要准确识别出当前场景是在构建哪些产品家族的系列产品对象。
- 每个产品家族的产品系列都要在 AbstractFactory 接口里面定义