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