导学
在创建型设计模式家族中,抽象工厂模式是工厂方法模式的 "进阶版"。它不仅继承了工厂方法模式的优势,还能处理更复杂的对象创建场景 ------一次性创建一整套相互匹配的 "产品族"。今天我们就来深入剖析这个设计模式。
抽象工厂模式概述
抽象工厂模式 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单来说,它能批量生产 "配套产品",比如 "华为手机 + 华为耳机 + 华为平板" 这样的产品族。
它还有个别名 ------Kit 模式(套件模式),形象地体现了它生产 "产品套件" 的特性。
抽象工厂模式结构与实现
抽象工厂模式包含以下 4 个核心角色:
| 角色 | 职责 |
|---|---|
| 抽象工厂 | 声明一组用于创建不同产品的方法,每个方法对应一种产品类型。 |
| 具体工厂 | 实现抽象工厂的方法,生产属于同一 "产品族" 的具体产品。 |
| 抽象产品 | 为每类产品声明接口,定义产品的业务方法。 |
| 具体产品 | 实现抽象产品接口,是具体工厂的生产结果。 |
实战:界面皮肤库设计
我们以 "界面皮肤库" 为例,实现一个支持 Spring 风格、Summer 风格的皮肤系统,每种风格包含配套的 "按钮、文本框、组合框"。
1. 抽象产品接口
java
// 按钮接口
public interface Button {
void display();
}
// 文本框接口
public interface TextField {
void display();
}
// 组合框接口
public interface ComboBox {
void display();
}
2. 具体产品实现
java
// Spring风格按钮
public class SpringButton implements Button {
@Override
public void display() {
System.out.println("显示浅绿色按钮");
}
}
// Summer风格按钮
public class SummerButton implements Button {
@Override
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
// Spring风格文本框
public class SpringTextField implements TextField {
@Override
public void display() {
System.out.println("显示绿色边框文本框");
}
}
// Summer风格文本框
public class SummerTextField implements TextField {
@Override
public void display() {
System.out.println("显示蓝色边框文本框");
}
}
// Spring风格组合框
public class SpringComboBox implements ComboBox {
@Override
public void display() {
System.out.println("显示绿色边框组合框");
}
}
// Summer风格组合框
public class SummerComboBox implements ComboBox {
@Override
public void display() {
System.out.println("显示蓝色边框组合框");
}
}
3. 抽象工厂与具体工厂
java
// 皮肤工厂接口(抽象工厂)
public interface SkinFactory {
Button createButton();
TextField createTextField();
ComboBox createComboBox();
}
// Spring皮肤工厂(具体工厂)
public class SpringSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
// Summer皮肤工厂(具体工厂)
public class SummerSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
4. 客户端测试
java
public class Client {
public static void main(String[] args) {
// 从配置文件(或XML)中获取具体工厂类名,这里直接示例
SkinFactory factory = new SpringSkinFactory(); // 可替换为SummerSkinFactory
Button button = factory.createButton();
TextField textField = factory.createTextField();
ComboBox comboBox = factory.createComboBox();
button.display();
textField.display();
comboBox.display();
}
}
运行结果:
显示浅绿色按钮
显示绿色边框文本框
显示绿色边框组合框
抽象工厂模式的优 / 缺点与适用环境
优点
1.隔离具体类生成:客户端无需关心产品如何创建,只需与抽象接口交互。
2.保证产品族一致性:同一工厂生产的产品天然匹配(如 Spring 风格的按钮、文本框、组合框视觉风格统一)。
3.支持开闭原则(新增产品族):新增一套皮肤时,无需修改原有代码,只需新增具体工厂和产品即可。
缺点
新增产品等级结构困难:若要新增 "单选按钮" 组件,需修改抽象工厂和所有具体工厂,违背开闭原则(这就是 "开闭原则的倾斜性")。
适用环境
- 系统存在多个产品族,且每次只使用其中一个(如皮肤库的 "Spring 族""Summer 族")。
- 产品族内的产品需一起使用,且结构稳定(设计完成后不再新增产品类型,如不再新增 "下拉树" 组件)。
总结
抽象工厂模式是创建 "产品族" 的利器,它让配套产品的创建更高效、更具一致性。虽然在新增产品类型时存在局限性,但在框架开发、多主题系统等场景中依然是不可替代的设计方案。掌握它,能让你的代码在处理复杂对象创建时更具扩展性与维护性。