设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式的核心思想是通过工厂接口封装对象的创建过程,并允许客户端使用统一的方式来创建不同种类的对象。
抽象工厂模式的结构:
- 抽象工厂(AbstractFactory):
- 定义创建一组相关产品的接口。
- 具体工厂(ConcreteFactory):
- 实现抽象工厂接口,负责创建具体的产品对象。
- 抽象产品(AbstractProduct):
- 定义产品的公共接口。
- 具体产品(ConcreteProduct):
- 实现抽象产品接口,表示具体的产品。
- 客户端(Client):
- 通过抽象工厂来使用具体产品,不关心具体产品的实现。
示例代码:跨平台 UI 工具库
问题背景
假设需要开发一个跨平台的 UI 工具库,该工具库需要支持两种操作系统(Windows 和 MacOS),每个操作系统都有自己的按钮和复选框样式。我们可以使用抽象工厂模式来解决。
实现代码
// 抽象产品:按钮
interface Button {
void render(); // 按钮渲染方法
}
// 抽象产品:复选框
interface CheckBox {
void render(); // 复选框渲染方法
}
// 具体产品:Windows 风格按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染 Windows 风格的按钮");
}
}
// 具体产品:Windows 风格复选框
class WindowsCheckBox implements CheckBox {
@Override
public void render() {
System.out.println("渲染 Windows 风格的复选框");
}
}
// 具体产品:MacOS 风格按钮
class MacButton implements Button {
@Override
public void render() {
System.out.println("渲染 MacOS 风格的按钮");
}
}
// 具体产品:MacOS 风格复选框
class MacCheckBox implements CheckBox {
@Override
public void render() {
System.out.println("渲染 MacOS 风格的复选框");
}
}
// 抽象工厂
interface UIFactory {
Button createButton(); // 创建按钮
CheckBox createCheckBox(); // 创建复选框
}
// 具体工厂:Windows 工厂
class WindowsFactory implements UIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public CheckBox createCheckBox() {
return new WindowsCheckBox();
}
}
// 具体工厂:MacOS 工厂
class MacFactory implements UIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public CheckBox createCheckBox() {
return new MacCheckBox();
}
}
// 客户端
public class AbstractFactoryExample {
public static void main(String[] args) {
// 使用 Windows 工厂
UIFactory windowsFactory = new WindowsFactory();
Button windowsButton = windowsFactory.createButton();
CheckBox windowsCheckBox = windowsFactory.createCheckBox();
windowsButton.render();
windowsCheckBox.render();
// 使用 MacOS 工厂
UIFactory macFactory = new MacFactory();
Button macButton = macFactory.createButton();
CheckBox macCheckBox = macFactory.createCheckBox();
macButton.render();
macCheckBox.render();
}
}
输出结果:
渲染 Windows 风格的按钮
渲染 Windows 风格的复选框
渲染 MacOS 风格的按钮
渲染 MacOS 风格的复选框
抽象工厂模式的优点:
- 分离具体类:
- 客户端通过抽象工厂创建产品,而无需关心具体产品的类名和实现细节。
- 产品族一致性:
- 保证同一个工厂生产的产品属于同一产品族,符合设计要求。
- 开放-关闭原则:
- 新增产品族时,只需添加新的具体工厂类,无需修改现有代码。
抽象工厂模式的缺点:
- 复杂性增加:
- 引入较多的类和接口,增加了代码的复杂性。
- 难以扩展产品种类:
- 如果需要新增产品种类,需要修改抽象工厂接口及所有具体工厂,违反了开闭原则。
抽象工厂模式的适用场景:
- 需要创建一系列相关产品,并希望确保它们属于同一个产品族(例如跨平台 UI)。
- 系统需要提供多种配置或变体,客户端不需要了解具体实现。
- 希望通过接口来隔离具体类,从而实现产品的可替换性。
抽象工厂模式在跨平台开发、框架设计等场景中非常常见,比如 Java 的 javax.swing
或 javax.awt
就应用了该模式。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)