模式概述
抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它围绕一个超级工厂(抽象工厂)创建其他工厂,是工厂方法模式的升级版,能创建多个产品族中的对象。
简单代码示例
1. 定义抽象产品接口
// 按钮接口
interface Button {
void display();
}
// 文本框接口
interface TextField {
void display();
}
2. 实现具体产品
// 蓝色主题按钮
class BlueButton implements Button {
@Override
public void display() {
System.out.println("显示蓝色按钮");
}
}
// 蓝色主题文本框
class BlueTextField implements TextField {
@Override
public void display() {
System.out.println("显示蓝色文本框");
}
}
// 红色主题按钮
class RedButton implements Button {
@Override
public void display() {
System.out.println("显示红色按钮");
}
}
// 红色主题文本框
class RedTextField implements TextField {
@Override
public void display() {
System.out.println("显示红色文本框");
}
}
3. 定义抽象工厂
interface SkinFactory {
Button createButton();
TextField createTextField();
}
4. 实现具体工厂
// 蓝色主题工厂
class BlueSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new BlueButton();
}
@Override
public TextField createTextField() {
return new BlueTextField();
}
}
// 红色主题工厂
class RedSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new RedButton();
}
@Override
public TextField createTextField() {
return new RedTextField();
}
}
5. 客户端使用
public class Client {
public static void main(String[] args) {
// 创建蓝色主题系列
SkinFactory blueFactory = new BlueSkinFactory();
Button blueButton = blueFactory.createButton();
TextField blueTextField = blueFactory.createTextField();
blueButton.display(); // 输出: 显示蓝色按钮
blueTextField.display(); // 输出: 显示蓝色文本框
// 创建红色主题系列
SkinFactory redFactory = new RedSkinFactory();
Button redButton = redFactory.createButton();
TextField redTextField = redFactory.createTextField();
redButton.display(); // 输出: 显示红色按钮
redTextField.display(); // 输出: 显示红色文本框
}
}
技术细节
1.模式组成
组件 | 职责说明 |
---|---|
抽象产品 | 为产品对象声明接口 |
具体产品 | 定义具体工厂创建的产品对象 |
抽象工厂 | 声明创建抽象产品对象的接口 |
具体工厂 | 实实现创建具体产品对象的操作 |
2.优点与缺点
优点:
- 产品族一致性:保证客户端始终使用同一个产品族中的对象
- 切换产品族容易:只需改变具体工厂即可切换整个产品系列
- 高内聚低耦合:将产品创建代码集中在工厂中,便于维护
缺点:
- 扩展困难:添加新产品需要修改抽象工厂接口及所有实现类
- 复杂度增加:增加了系统的抽象性和理解难度
模式应用
在 Spring 框架中,抽象工厂模式被广泛应用于核心容器的设计中
- BeanFactory 接口
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyService service = factory.getBean(MyService.class); // 通过抽象接口获取产品
- ApplicationContext 接口
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyService service = context.getBean(MyService.class); // 统一接口获取产品