抽象工厂
更新: 6/28/2025 字数: 0 字 时长: 0 分钟
定义
抽象工厂模式 (Abstract Factory Pattern) 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
角色
- 抽象工厂 (AbstractFactory): 声明创建产品族的方法
- 具体工厂 (ConcreteFactory): 实现创建产品族的方法
- 抽象产品 (AbstractProduct): 为产品声明接口
- 具体产品 (ConcreteProduct): 实现抽象产品接口
实现
java
// 抽象产品 A
interface Button {
void render();
}
// 具体产品 A1
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染 Windows 风格按钮");
}
}
// 具体产品 A2
class MacButton implements Button {
@Override
public void render() {
System.out.println("渲染 Mac 风格按钮");
}
}
// 抽象产品 B
interface Checkbox {
void check();
}
// 具体产品 B1
class WindowsCheckbox implements Checkbox {
@Override
public void check() {
System.out.println("Windows 复选框选中");
}
}
// 具体产品 B2
class MacCheckbox implements Checkbox {
@Override
public void check() {
System.out.println("Mac 复选框选中");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂 1
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// 具体工厂 2
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
// 客户端
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void paint() {
button.render();
checkbox.check();
}
public static void main(String[] args) {
// 创建 Windows 风格应用
Application windowsApp = new Application(new WindowsFactory());
windowsApp.paint();
// 创建 Mac 风格应用
Application macApp = new Application(new MacFactory());
macApp.paint();
}
}
优缺点
优点:
- 确保产品兼容性(同一工厂创建的产品能协同工作)
- 避免客户端与具体产品类耦合
- 单一职责原则:产品创建代码集中在单一位置
- 开闭原则:引入新产品族时无需修改现有代码
缺点:
- 需要定义大量接口和类,增加系统复杂度
- 支持新种类的产品困难(需要修改抽象工厂接口)
应用场景
- 系统需要独立于其产品的创建、组合和表示方式
- 系统需要配置多个产品族中的一个
- 需要强调一系列相关产品对象的设计以便联合使用
- 提供产品类库,只暴露接口不暴露实现
与工厂方法的区别
- 抽象工厂创建产品族,工厂方法创建单一产品
- 抽象工厂通过组合实现,工厂方法通过继承实现
- 抽象工厂更注重产品间的兼容性