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