当前位置: 首页 > news >正文

Java设计模式精讲---02抽象工厂模式

导学

在创建型设计模式家族中,抽象工厂模式是工厂方法模式的 “进阶版”。它不仅继承了工厂方法模式的优势,还能处理更复杂的对象创建场景 ——一次性创建一整套相互匹配的 “产品族”。今天我们就来深入剖析这个设计模式。

抽象工厂模式概述

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单来说,它能批量生产 “配套产品”,比如 “华为手机 + 华为耳机 + 华为平板” 这样的产品族。

它还有个别名 ——Kit 模式(套件模式),形象地体现了它生产 “产品套件” 的特性。

抽象工厂模式结构与实现

抽象工厂模式包含以下 4 个核心角色:

角色职责
抽象工厂声明一组用于创建不同产品的方法,每个方法对应一种产品类型。
具体工厂实现抽象工厂的方法,生产属于同一 “产品族” 的具体产品。
抽象产品为每类产品声明接口,定义产品的业务方法。
具体产品实现抽象产品接口,是具体工厂的生产结果。

实战:界面皮肤库设计

我们以 “界面皮肤库” 为例,实现一个支持 Spring 风格、Summer 风格的皮肤系统,每种风格包含配套的 “按钮、文本框、组合框”。

1. 抽象产品接口
// 按钮接口
public interface Button {void display();
}// 文本框接口
public interface TextField {void display();
}// 组合框接口
public interface ComboBox {void display();
}
2. 具体产品实现
​
// Spring风格按钮
public class SpringButton implements Button {@Overridepublic void display() {System.out.println("显示浅绿色按钮");}
}// Summer风格按钮
public class SummerButton implements Button {@Overridepublic void display() {System.out.println("显示浅蓝色按钮");}
}// Spring风格文本框
public class SpringTextField implements TextField {@Overridepublic void display() {System.out.println("显示绿色边框文本框");}
}// Summer风格文本框
public class SummerTextField implements TextField {@Overridepublic void display() {System.out.println("显示蓝色边框文本框");}
}// Spring风格组合框
public class SpringComboBox implements ComboBox {@Overridepublic void display() {System.out.println("显示绿色边框组合框");}
}// Summer风格组合框
public class SummerComboBox implements ComboBox {@Overridepublic void display() {System.out.println("显示蓝色边框组合框");}
}​
3. 抽象工厂与具体工厂
​
// 皮肤工厂接口(抽象工厂)
public interface SkinFactory {Button createButton();TextField createTextField();ComboBox createComboBox();
}// Spring皮肤工厂(具体工厂)
public class SpringSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SpringButton();}@Overridepublic TextField createTextField() {return new SpringTextField();}@Overridepublic ComboBox createComboBox() {return new SpringComboBox();}
}// Summer皮肤工厂(具体工厂)
public class SummerSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SummerButton();}@Overridepublic TextField createTextField() {return new SummerTextField();}@Overridepublic ComboBox createComboBox() {return new SummerComboBox();}
}​
4. 客户端测试
​
public class Client {public static void main(String[] args) {// 从配置文件(或XML)中获取具体工厂类名,这里直接示例SkinFactory factory = new SpringSkinFactory(); // 可替换为SummerSkinFactoryButton button = factory.createButton();TextField textField = factory.createTextField();ComboBox comboBox = factory.createComboBox();button.display();textField.display();comboBox.display();}
}​

运行结果:

显示浅绿色按钮
显示绿色边框文本框
显示绿色边框组合框

抽象工厂模式的优 / 缺点与适用环境

优点

        1.隔离具体类生成:客户端无需关心产品如何创建,只需与抽象接口交互。

        2.保证产品族一致性:同一工厂生产的产品天然匹配(如 Spring 风格的按钮、文本框、组合框视觉风格统一)。

        3.支持开闭原则(新增产品族):新增一套皮肤时,无需修改原有代码,只需新增具体工厂和产品即可。

缺点

        新增产品等级结构困难:若要新增 “单选按钮” 组件,需修改抽象工厂和所有具体工厂,违背开闭原则(这就是 “开闭原则的倾斜性”)。

适用环境

  • 系统存在多个产品族,且每次只使用其中一个(如皮肤库的 “Spring 族”“Summer 族”)。
  • 产品族内的产品需一起使用,且结构稳定(设计完成后不再新增产品类型,如不再新增 “下拉树” 组件)。

总结

抽象工厂模式是创建 “产品族” 的利器,它让配套产品的创建更高效、更具一致性。虽然在新增产品类型时存在局限性,但在框架开发、多主题系统等场景中依然是不可替代的设计方案。掌握它,能让你的代码在处理复杂对象创建时更具扩展性与维护性。

http://www.dtcms.com/a/572842.html

相关文章:

  • 【ChatGPT系列】ChatGPT Atlas:未来浏览器的智慧体验
  • AWS实现S3配置私钥以及上传
  • C++ opencv拟合直线
  • TDengine IDMP 1.0.5.0 及近期更新总览:模型计算、可视化、异常检测全面升级
  • Melotopia For HarmonyOS 的 HAP 签名安装包在 DevEco Studio 中安装的详细步骤
  • 网页遇到ddos网络攻击,应该如何应对
  • LlamaFactory微调效果与vllm部署效果不一致
  • 国外营销网站求一个旅游网站的代码
  • Opencv(八) :ROI 切割
  • 计算机网络自顶向下方法34——网络层 排队论 缓存大小调节 分组调度 网络中立性
  • 网站怎么做适配南通网站建设培训
  • 本地缓存与分布式缓存:深入解析与多级缓存架构实践
  • 【C语言实战(73)】深入C语言网络编程:UDP与TCP的实战对决
  • 健身房预约系统SSM+Mybatis(五、预约展示)
  • 记录对某985证书站挖掘
  • 解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
  • 探索LoSA:动态低秩稀疏自适应——大模型高效微调的新突破
  • wordpress表格插件网站建设关键词优化价格
  • Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台
  • Linux服务器安装jdk和maven详解
  • 回归、预测、分类三者关系
  • 微信平台微网站开发乙肝能治好吗
  • Skill 与 Workflow:让自动化更“聪明”的系统架构
  • AI+Python近红外光谱分析机器学习与深度学习实战,覆盖提示词撰写、数据预处理、回归/神经网络/集成学习/迁移学习/可解释性可视化等
  • ESP8266植入程序实现MQTT控制
  • 突击宝典:pytorch面试高频考点精析
  • 建设公司网站的背景意义上海网站开发设计培训
  • 电子商务网站的建设和流程就业培训机构有哪些
  • ICML 2025|基于大语言模型的多比特文本水印方法
  • 在 iOS 18 自动填充密码失败,如何排查?