抽象工厂模式
概念
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。该模式通常用于处理一组产品对象的创建,确保每个产品的组合是一致的。
应用场景
- 产品系列:当系统需要创建多个相关产品的实例时,例如在图形用户界面中可能需要按钮、文本框和滚动条。
- 跨平台应用:在不同平台上提供不同的实现,确保一致的接口和风格。
- 系统扩展:在不改变现有代码的情况下,添加新产品系列时,只需实现新的工厂。
- 配置管理:根据不同的配置文件加载不同的产品系列。
注意点
- 复杂性:抽象工厂模式的引入可能增加系统复杂性,需要明确产品系列的设计。
- 接口的设计:设计良好的接口非常重要,以便扩展和维护。
- 新产品的引入:增加新产品时,需要更新抽象工厂及其所有具体工厂,可能会影响现有代码。
核心要素
- 抽象工厂:定义创建一系列产品的方法。
- 具体工厂:实现抽象工厂,负责创建具体产品。
- 抽象产品:定义产品的接口。
- 具体产品:实现抽象产品的具体类。
Java代码示例
java
// 抽象产品
interface Button {
void paint();
}
interface Checkbox {
void paint();
}
// 具体产品
class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("绘制 Windows 按钮");
}
}
class WindowsCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("绘制 Windows 复选框");
}
}
class MacButton implements Button {
@Override
public void paint() {
System.out.println("绘制 Mac 按钮");
}
}
class MacCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("绘制 Mac 复选框");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
GUIFactory factory;
String osType = "Windows"; // 可以动态决定
if (osType.equals("Windows")) {
factory = new WindowsFactory();
} else {
factory = new MacFactory();
}
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();
button.paint();
checkbox.paint();
}
}
各种变形用法
-
扩展的抽象工厂
当需要扩展产品系列时,可以创建新的抽象工厂。
javainterface AdvancedGUIFactory extends GUIFactory { Slider createSlider(); }
-
链式工厂
通过将工厂的创建逻辑封装到链中,按需创建产品。
javaclass ChainFactory implements GUIFactory { private GUIFactory nextFactory; public void setNextFactory(GUIFactory nextFactory) { this.nextFactory = nextFactory; } @Override public Button createButton() { return nextFactory.createButton(); } @Override public Checkbox createCheckbox() { return nextFactory.createCheckbox(); } }
-
动态工厂选择
根据环境或配置动态选择具体工厂。
javaclass DynamicFactory { public static GUIFactory getFactory(String type) { if (type.equals("Windows")) { return new WindowsFactory(); } else { return new MacFactory(); } } }
这些是抽象工厂模式的基本知识和变形用法!