JAVA设计模式3:抽象工厂模式,这是一种创建型设计模式

news2024/12/22 23:10:03

作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。
主打方向:Vue、SpringBoot、微信小程序

本文讲解了 Java 设计模式中的抽象工厂模式,并给出了样例代码,抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体类。

在这里插入图片描述

目录

  • 一、什么是抽象工厂模式
  • 二、抽象工厂模式实例
  • 三、抽象工厂模式的应用场景
  • 四、抽象工厂模式面试题
  • 五、总结


一、什么是抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体类。

在抽象工厂模式中,有一个抽象工厂接口,该接口声明了一些创建不同产品的方法。具体的工厂类实现了该接口,并负责创建具体的产品对象。每个具体的工厂类都对应着一组相关的产品。

抽象工厂模式的核心思想是将对象的创建与对象的使用分离开来。通过使用抽象工厂模式,客户端代码可以通过工厂接口来创建产品对象,而不需要直接依赖于具体的产品类。这样可以实现客户端与具体产品的解耦,提高代码的灵活性和可扩展性。

抽象工厂模式适用于以下 3 3 3 个场景,请同学们认真学习。

  1. 需要创建一系列相互关联或相互依赖的产品对象。
  2. 需要在运行时动态决定创建哪种具体产品。
  3. 需要隐藏具体产品的实现细节,只对外提供抽象接口。

总结来说,抽象工厂模式通过提供一个抽象工厂接口和具体工厂实现类,实现了对象的创建和使用的解耦,提供了一种灵活的方式来创建一系列相关的产品对象。

在这里插入图片描述


二、抽象工厂模式实例

下面是一个简单的 Java 代码示例,演示了如何使用抽象工厂模式创建不同操作系统的按钮和文本框。

首先,我们定义一个抽象的 GUI 组件接口和两个具体的实现类,代码如下。

// 抽象产品接口 - 按钮
interface Button {
    void render();
}

// 具体产品 - Windows按钮
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering a button in Windows style.");
    }
}

// 具体产品 - MacOS按钮
class MacOSButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering a button in MacOS style.");
    }
}

// 抽象产品接口 - 文本框
interface TextBox {
    void render();
}

// 具体产品 - Windows文本框
class WindowsTextBox implements TextBox {
    @Override
    public void render() {
        System.out.println("Rendering a text box in Windows style.");
    }
}

// 具体产品 - MacOS文本框
class MacOSTextBox implements TextBox {
    @Override
    public void render() {
        System.out.println("Rendering a text box in MacOS style.");
    }
}

接下来,我们定义一个抽象工厂接口,用于创建 GUI 组件,代码如下。

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    TextBox createTextBox();
}

// 具体工厂 - Windows工厂
class WindowsGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextBox createTextBox() {
        return new WindowsTextBox();
    }
}

// 具体工厂 - MacOS工厂
class MacOSGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public TextBox createTextBox() {
        return new MacOSTextBox();
    }
}

最后,我们使用抽象工厂创建具体的 GUI 组件,代码如下。

public class Main {
    public static void main(String[] args) {
        // 创建Windows风格的GUI组件
        GUIFactory windowsFactory = new WindowsGUIFactory();
        Button windowsButton = windowsFactory.createButton();
        TextBox windowsTextBox = windowsFactory.createTextBox();

        windowsButton.render();
        windowsTextBox.render();

        // 创建MacOS风格的GUI组件
        GUIFactory macOSFactory = new MacOSGUIFactory();
        Button macOSButton = macOSFactory.createButton();
        TextBox macOSTextBox = macOSFactory.createTextBox();

        macOSButton.render();
        macOSTextBox.render();
    }
}

输出结果会根据不同的操作系统风格而有所不同,例如在 Windows 系统下,输出将是如下所示。

Rendering a button in Windows style.
Rendering a text box in Windows style.

而在 MacOS 系统下,输出将是如下所示。

Rendering a button in MacOS style.
Rendering a text box in MacOS style.

通过使用抽象工厂模式,我们可以实现根据不同的工厂来创建不同风格的 GUI 组件,而无需直接依赖于具体的产品类。

这样可以提高代码的灵活性,使得我们能够轻松地切换和扩展不同风格的 GUI 组件。

在这里插入图片描述


三、抽象工厂模式的应用场景

抽象工厂模式适用于以下场景:

  1. 需要创建一系列相关或相互依赖的产品对象:抽象工厂模式可以帮助我们创建一系列相关的产品对象,这些产品对象之间有一定的关联或依赖关系。例如,在一个游戏中,我们可能需要创建不同阵营的角色、武器和装备,这些产品之间有一定的关联性。
  2. 需要在运行时动态决定创建哪种具体产品:抽象工厂模式允许我们在运行时根据条件或配置来决定创建哪种具体产品。这种灵活性使得我们可以根据不同的需求来创建不同的产品。
  3. 需要隐藏具体产品的实现细节:抽象工厂模式将产品的创建和使用进行了解耦,客户端只需要关注抽象工厂接口和产品接口,而不需要关心具体产品的实现细节。这样可以提高代码的可维护性和可扩展性。
  4. 需要满足开闭原则:抽象工厂模式可以满足开闭原则,即对扩展是开放的,对修改是关闭的。通过添加新的具体工厂和产品类,我们可以轻松扩展抽象工厂模式的功能,而不需要修改现有的代码。

抽象工厂模式适用于那些需要创建一系列相关或相互依赖的产品对象,并且需要在运行时根据条件或配置来决定创建具体产品的情况下。它可以帮助我们实现代码的灵活性、可维护性和可扩展性。

在这里插入图片描述


四、抽象工厂模式面试题

  1. 什么是抽象工厂模式?它解决了什么问题?
  2. 抽象工厂模式和工厂方法模式有什么区别?
  3. 抽象工厂模式的角色有哪些?
  4. 你能给一个简单的抽象工厂模式的实例吗?
  5. 你认为抽象工厂模式在哪些场景下使用得最好?

五、总结

本文讲解了 Java 设计模式中的抽象工厂模式,并给出了样例代码,在下一篇博客中,将讲解 Java 原型模式。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式BL304可提供4路RS485/RS232口

BL304网关具有多功能的数据通信和处理设备,具有多种输入和输出接口,支持多种操作系统和应用程序,以及数据库连接。下面我们将详细介绍该产品的特点和功能。 设备提供了多路RS485/RS232接口、CAN口、网口、DI口、PWM口输出以及USB接口&#xf…

算法面试-深度学习基础面试题整理(2023.8.29开始,每天下午持续更新....)

一、无监督相关(聚类、异常检测) 1、常见的距离度量方法有哪些?写一下距离计算公式。 1)连续数据的距离计算: 闵可夫斯基距离家族: 当p 1时,为曼哈顿距离;p 2时,为欧…

天津专业大数据培训班 教你分析大数据行业前景

大数据分析是IT行业挺火的词汇,围绕大数据分析产生的数据仓库、数据安全、数据挖掘等商业价值也渐渐地被挖掘了出来,大数据时代渐渐来临...... 大数据是什么 随着科技的发展,尤其是互联网的深入,新兴了大数据这个行业&#xff0…

无涯教程-JavaScript - LOGINV函数

LOGINV函数替代Excel 2010中的LOGNORM.INV函数。 描述 该函数返回x的对数正态累积分布函数的逆函数,其中ln(x)的分布通常带有参数mean和standard_dev。 如果pLOGNORMDIST(x,...),则LOGINV(p,...) x 使用对数正态分布来分析对数转换的数据。 语法 LOGINV (probability, me…

软件项目验收测试流程

软件系统验收测试 软件项目验收测试是对系统进行全面的测试,以验证其是否符合合同要求,出具第三方测试报告,为系统验收提供依据。 软件产品验收测试一直以来被用于不同的技术和方法中,有时指的是同一个概念,有时也可…

实体机上搭建程序出现问题的处理办法(sqlserver2012)

【金山文档】 处理流程https://kdocs.cn/l/cvWexbkkGunf 如果发现实体机上安装程序存在问题,马山就可以通过虚拟机安装或者docker 安装的方式去处理

2021年06月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 3的逆波兰表示法为 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 3) * 4的逆波兰表示法为* 2 3…

【【萌新的STM32的学习--非正点原子视频的中断设计思路】】

萌新的STM32学习–非正点原子视频的中断设计思路 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态…

ZMTP协议

ZoreMQ Transport Protocol是一个传输层协议,用于ZMQ的连接的信息交互,本文档描述的是3.0协议,主要分析基于NULL Security Mechanism 协议语法 ZMTP由三部分组成,分别是 greeting、handshake、traffic 部分描述构成greeting描述…

如何将国标规范用EndNote插入到英文期刊中,自定义文献插入指南

EndNote自定义文献 1.插入国标JTG 2034-2020这种新建一个Standard![](https://img-blog.csdnimg.cn/406cf11d1496431a9cf784f3ab71c6a1.png)Reference填入信息参考 插入英文期刊规范ASTM 1.插入国标JTG 2034-2020这种 首先找到大家要投稿的英文期刊,然后去找那些中…

Python:多变量赋值

相关文章 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 Python中的赋值语句可以同时对多个变量进行对象绑定(赋值),既可以是多变量链式赋值,也可以是多变量平行赋值&#x…

爱胜品YPS-1133DN系列打印机网络驱动安装的一点小经验

爱胜品YPS-1133DN打印机基本参数: 项目 详细参数 品牌 ICSP爱胜品 外观配色 上灰下白经典实用设计 打印速度 33ppm(A4)、35ppm(Letter)、58ppm(A5) 首页打印时间 ≤8秒 最大月打印量 …

基于aarch64分析kernel源码 四:printk 内核打印

一、参考 Message logging with printk — The Linux Kernel documentation 如何获得正确的printk格式占位符 — The Linux Kernel documentation 使用printk记录消息 — The Linux Kernel documentation printk 内核打印 – 人人都懂物联网 (getiot.tech) 内核printk原理…

对语言模型能否替代知识图谱的再思考

深度学习自然语言处理 原创作者:cola 进NLP群—>加入NLP交流群 知识图谱(KGs)包含了许多真实世界的知识,在许多领域都发挥着重要重用,但是大型的知识图谱构建过程需要大量的人工介入。随着语言模型(LMs&…

Vagrant + VirtualBox + CentOS7 + WindTerm 5分钟搭建本地linux开发环境

1、准备阶段 Vagrant 版本:vagrant_2.2.18_x86_64.msi 链接:https://developer.hashicorp.com/vagrant/downloads VirtualBox 版本:VirtualBox-6.1.46-158378-Win.exe 链接:https://www.virtualbox.org/wiki/Download_Old_Builds …

RHCE——十四、变量和引用

RHCE 一、深入认识变量1、什么是变量2、变量的名称3、变量的类型4、变量的定义5、自定义变量6、环境变量7、位置变量 二、变量赋值和作用域1、显示赋值:变量名变量值2、read 从键盘读入变量值3、变量和引号4、变量的作用域5、变量的运算 一、深入认识变量 1、什么是…

编程题四大算法思想(三)——贪心法:找零问题、背包问题、任务调度问题、活动选择问题、Prim算法

文章目录 贪心法找零问题(change-making problem)贪心算法要求基本思想适合求解问题的特征 背包问题0/1背包问题0/1背包问题——贪心法 分数背包问题 任务调度问题活动选择问题活动选择——贪心法最早结束时间优先——最优性证明 Prim算法 贪心法 我在当…

【Electron将HTML项目打包成桌面应用exe文件】

目标:前端将静态页面文件夹所有页面打包成一个exe文件(不包含其它文件)可运行。 步骤 1、初始化 npm init此时项目多出一个package.json文件。 {"name": "my-electron-app","version": "1.0.0",…

前端面试中Vue的有经典面试题二

7. Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: 点击button会发现, obj.b 已经成功添加,但是视图并未刷新: 原因在于在Vue实例创建时, obj.b 并未声明,因…

【多线程案例】单例模式(懒汉模式和饿汉模式)

文章目录 1. 什么是单例模式?2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式? 提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊…