1. 介绍
1.1 定义
- 抽象工厂模式(Abstract Factory Pattern)又称Kit模式,它属于创建型模式
- 工厂父类提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;工厂子类负责实现具体的产品实例
- 抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法中每个工厂只能创建一类产品
1.2 作用
- 可以用抽象的接口创建一系列产品,用户不需要关心实际生产出的具体产品是什么
2. 模式结构
2.1 UML类图
2.2 模式组成
- 抽象工厂(Factory):具体工厂的父类,描述具体工厂的公共接口,声明了一组用于创建一系列产品的方法,每个方法对应一种产品
- 具体工厂(Concrete Factory):被外部调用,负责创建产品的实例,生成一组具体的产品
- 抽象产品(Product):具体产品的父类,描述具体产品的公共接口
- 具体产品(Concrete Product):描述生产的具体产品
3. 代码实例
3.1 背景
- 现在有两类电脑,分别是WINDOWS和MAC,假设他们的CPU和RAM各不相同,所以要分别生产不同的CPU和RAM
3.2 应用
-
步骤1 创建抽象产品类,定义具体产品的公共接口
public abstract class CPU { public abstract void produce(); } public abstract class RAM { abstract public void produce(); }
-
步骤2 创建具体产品类,定义生产的具体产品
public class MacCPU extends CPU { @Override public void produce() { System.out.println("produce mac cpu"); } } public class WindowsCPU extends CPU { @Override public void produce() { System.out.println("produce windows cpu"); } } public class MacRAM extends RAM { @Override public void produce() { System.out.println("produce mac ram"); } } public class WindowsRAM extends RAM { @Override public void produce() { System.out.println("produce windows ram"); } }
-
步骤3 创建抽象工厂类,定义具体工厂的公共接口
public abstract class PCAbstractFactory { public abstract CPU createCPU(); public abstract RAM createRAM(); }
-
步骤4 创建具体工厂类,定义创建对应具体产品实例的方法
public class MacFactory extends PCAbstractFactory { @Override public CPU createCPU() { return new MacCPU(); } @Override public RAM createRAM() { return new MacRAM(); } }
public class WindowsFactory extends PCAbstractFactory { @Override public CPU createCPU() { return new WindowsCPU(); } @Override public RAM createRAM() { return new WindowsRAM(); } }
-
步骤5 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
public class Demo { public static void main(String[] args) { PCAbstractFactory windowsFactory = new WindowsFactory(); windowsFactory.createCPU().produce(); windowsFactory.createRAM().produce(); PCAbstractFactory macFactory = new MacFactory(); macFactory.createCPU().produce(); macFactory.createRAM().produce(); } }
4. 优点
- 基本同工厂方法模式
5. 缺点
- 基本同工厂方法模式
- 抽象工厂模式很难支持产品族中新种类产品的添加:抽象工厂的接口中已经确定了可以被创建的产品集合,如果需要添加新产品,就必须去修改抽象工厂的接口,这样就会涉及到抽象工厂类以及所有具体工厂类的变化,违背了开闭原则(产品族的增加符合开闭原则)
6. 应用场景
- 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品