Java设计模式-抽象工厂模式

抽象工厂模式

简介

设计模式是软件设计中的一种常见方法,通过定义一系列通用的解决方案,来解决常见的软件设计问题。其中,抽象工厂模式是一种非常常见的设计模式,它可以帮助我们创建一组相关的对象,而不需要指定具体的实现方式。

抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关的对象,而不需要暴露具体的实现方式。通过使用抽象工厂模式,我们可以把客户端与具体实现分离,从而提高代码的可维护性和可扩展性。

抽象工厂模式的主要用途是创建一组相关的对象。例如,在一个游戏中,我们需要创建一组不同种类的武器、防具和道具。这些对象可能有不同的实现方式,但是它们都属于同一组对象。通过使用抽象工厂模式,我们可以将它们的创建逻辑封装在一个工厂中,从而简化客户端代码。

在软件设计中,有很多与抽象工厂模式相似的设计模式,如工厂方法模式和建造者模式。这些模式也可以用来创建对象,但它们和抽象工厂模式之间存在一些区别。

  • 工厂方法模式

工厂方法模式和抽象工厂模式都可以用来创建对象,但是它们之间有一个重要的区别。在工厂方法模式中,我们只需要实现一个工厂方法,它负责创建一个特定类型的对象。而在抽象工厂模式中,我们需要实现一个工厂接口,它负责创建一组相关的对象。

  • 建造者模式

建造者模式是一种用于创建复杂对象的设计模式。它可以将一个复杂对象的构造逻辑拆分成多个简单的部分,并且允许客户端按照需要组装这些部分。与抽象工厂模式相比,建造者模式更加灵活,但是它也更加复杂。

实现

我们可以通过定义一个抽象工厂接口和多个具体工厂来实现抽象工厂模式。具体工厂实现工厂接口,并且负责创建一组相关的对象。

下面是一个使用抽象工厂模式创建按钮和文本框的示例。我们定义了一个抽象工厂接口GUIFactory,它包含了两个方法:createButton()createTextBox()。同时,我们也定义了两个具体工厂类WinFactoryMacFactory,它们都实现了GUIFactory接口,并且负责创建特定平台下的按钮和文本框,代码如下:

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

// 具体工厂类 - Windows工厂
class WinFactory implements GUIFactory {
    public Button createButton() {
        return new WinButton();
    }

    public TextBox createTextBox() {
        return new WinTextBox();
    }
}

// 具体工厂类 - Mac工厂
class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }

    public TextBox createTextBox() {
        return new MacTextBox();
    }
}


我们还定义了两个按钮类ButtonWinButton,以及两个文本框类TextBoxWinTextBox。它们都是抽象类或接口,具体实现由具体工厂类来完成。

// 抽象按钮类
abstract class Button {
    public abstract void paint();
}

// 抽象文本框类
abstract class TextBox {
    public abstract void paint();
}

// Windows按钮类
class WinButton extends Button {
    public void paint() {
        System.out.println("Windows按钮");
    }
}

// Windows文本框类
class WinTextBox extends TextBox {
    public void paint() {
        System.out.println("Windows文本框");
    }
}

我们还定义了Mac按钮类MacButton和Mac文本框类MacTextBox,具体实现和Windows下的按钮和文本框类似,这里就不一一列举了。

// Mac按钮类
class MacButton extends Button {
    public void paint() {
        System.out.println("Mac按钮");
    }
}

// Mac文本框类
class MacTextBox extends TextBox {
    public void paint() {
        System.out.println("Mac文本框");
    }
}

使用抽象工厂模式,我们可以轻松地创建不同平台下的按钮和文本框,而不需要暴露具体的实现方式。例如,在Windows平台下,我们可以使用WinFactory来创建按钮和文本框:

GUIFactory factory = new WinFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Windows按钮
Windows文本框

而在Mac平台下,我们可以使用MacFactory来创建按钮和文本框:

GUIFactory factory = new MacFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Mac按钮
Mac文本框

优缺点

抽象工厂模式的主要优点是:

  • 可以封装一组相关对象的创建逻辑,从而提高代码的可维护性和可扩展性。
  • 可以帮助客户端代码与具体类的解耦,从而提高代码的灵活性和可移植性。
  • 可以通过工厂的切换来实现对不同平台或不同产品系列的支持,同时又不会对客户端代码造成影响。

抽象工厂模式的缺点是:

  • 在新增产品系列时,需要修改工厂接口及所有具体工厂类的实现,从而增加了代码的维护成本。
  • 当产品系列比较复杂时,抽象工厂模式可能会变得比较臃肿。

运用场景

抽象工厂模式通常在以下场景中被使用:

  • 系统需要支持多种产品系列,并且每个产品系列都有相应的抽象工厂、具体工厂和产品类。
  • 系统需要动态地切换产品系列,例如根据用户的操作系统或用户的选择来决定使用哪种产品系列。
  • 系统的产品族和产品等级结构稳定不变,但是仍然需要满足开闭原则,以便在将来新增产品时能够方便地扩展系统功能。

抽象工厂模式在GUI设计、数据库访问、游戏开发等领域得到了广泛的应用,可以说是一种非常实用的设计模式。

总结

抽象工厂模式是一种创建型设计模式,用于封装一组相关对象的创建逻辑,从而提高代码的可维护性、可扩展性和可移植性。该模式通过定义抽象工厂、具体工厂和抽象产品等级结构,将客户端代码与具体类的实现解耦,并且可以实现对不同平台或不同产品系列的支持。抽象工厂模式的主要优点是可以提高代码的灵活性、可维护性和可扩展性,而缺点则是需要修改工厂接口及所有具体工厂类的实现,增加了代码的维护成本。抽象工厂模式通常在需要支持多种产品系列、动态切换产品系列或稳定不变的产品族和产品等级结构的场景中被使用。

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 3D之 利用Vector3 计算移动方向,以及实现位移多少

文章目录 先分析代码,从代码中了解Vector3 moveDirection new Vector3(10f, 0f, 100f);合法吗Vector3 moveDirection new Vector3 (xf,yf,zf)不是用来表示三维坐标的怎么表示在某个方向的位移 先分析代码,从代码中了解 这段代码是一个在游戏开发中常见…

Tushare入门小册

Tushare入门小册 一、Tushare平台介绍 Pro版数据更稳定质量更好了,我们提供的不再是直接从互联网抓取,而是通过社区的采集和整理存入数据库经过质量控制后再提供给用户。但Pro依然是个开放的,免费的平台,不带任何商业性质和目的…

【C修炼计划】卷壹 · 初识C语言

文章目录 卷壹 初识C语言一 C语言的起源二 C语言的特性三 C语言的应用范围四 C语言程序结构五 C语言书写规范六 C语言编译器安装附 参考资料 卷壹 初识C语言 一 C语言的起源 C语言的前生是B语言(BCPL,一种早期的高级语言)。下图描…

【Python原创毕设|课设】基于Python Flask的上海美食信息与可视化宣传网站项目-文末附下载方式以及往届优秀论文,原创项目其他均为抄袭

基于Python Flask的上海美食信息与可视化宣传网站(获取方式访问文末官网) 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着大数据和人工智能技术的迅速发展,我们设…

PySide6学习笔记--gui小模版使用

一、界面绘制 1.desiner画图 2.画图代码 # -*- coding: utf-8 -*-################################################################################ ## Form generated from reading UI file t1gui.ui ## ## Created by: Qt User Interface Compiler version 6.5.2 ## ##…

驱动开发——字符设备

字符设备 Linux 将系统设备分为:字符设备、块设备、网络设备。工作原理 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节, 按照字节流进行读写操作的设备,读写数据是分先后顺序的。在Linux的世界里面一切…

黑客自学路线

谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈 技术圈 职业圈。 娱乐圈:主要是初中生和高中生较多,玩网恋…

简单着色器编写(下)

函数部分介绍完了,最后来介绍一下main函数中的部分。 std::string vertexShader "#version 330 core\n" "\n" "layout(location0)in vec4 position;" "\n" "void main()\n" "{\n&…

淘宝商品优惠券详情item_get_app-获得淘宝app商品详情原数据

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)调用API接口入口secretString是调用密钥api_nameString是API接口名称(包括在请求地址中&#xff09…

微信小程序拉起支付报: 调用支付JSAPI缺少参数: total_fee

1. 调用支付JSAPI缺少参数: total_fee 2. 检查返回给前端调起支付的参数是否正确 一开始是params.put("package", prepay_id); 回来改回params.put("package", "prepay_id"prepay_id);

【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)

1.说明 pywinauto是一个用于自动化Python 模块,适合Windows系统的软件(GUI),可以通过Pywinauto遍历窗口(对话框)和窗口里的控件,也可以控制鼠标和键盘输入,所以它能做的事情比之前介…

36k字从Attention解读Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…

数据结构初阶--排序

目录 一.排序的基本概念 1.1.什么是排序 1.2.排序算法的评价指标 1.3.排序的分类 二.插入排序 2.1.直接插入排序 2.2.希尔排序 三.选择排序 3.1.直接选择排序 3.2.堆排序 重建堆 建堆 排序 四.交换排序 4.1.冒泡排序 4.2.快速排序 快速排序的递归实现 法一&a…

『SEQ日志』在 .NET中快速集成轻量级的分布式日志平台

📣读完这篇文章里你能收获到 如何在Docker中部署 SEQ:介绍了如何创建和运行 SEQ 容器,给出了详细的执行操作如何使用 NLog 接入 .NET Core 应用程序的日志:详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤日志记录示例&…

CSS background 背景

background属性为元素添加背景效果。 它是以下属性的简写,按顺序为: background-colorbackground-imagebackground-repeatbackground-attachmentbackground-position 以下所有示例中的花花.jpg图片的大小是4848。 1 background-color background-col…

【rust/egui】(四)看看template的app.rs:update以及组件TopBottomPanelButton

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 update update实际上还是eframe::App的…

BaiqiSoft MstHtmlEditor for .NET Crack

BaiqiSoft MstHtmlEditor for .NET Crack BaiqiSoft MstHtmlEditor获取.NET for win表单被认为是一个可以被用户轻松灵活地集成到C#、VB.NET甚至WPF软件中的元素。负责编辑的控制器,用于.NET Win Forms的MstHtmlEditor,允许用户和开发人员,甚…

stm32之11.USART串口通信

可以添加上拉电阻&#xff0c;但会增加功耗&#xff0c;传输距离变长 要添加库函数USART 官方参考文档说明书位置 ALT&#xff0b;左键可实现整体删除&#xff08;如下图&#xff09; 输出模式第三种模式AF ---------------------- 源码 远程控制pc端 #include <stm32f4x…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

之前的案例 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.1-&#xff1e;1.4_多方通行8的博客-CSDN博客 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.5-&#xff1e;2.3_多方通行8的博客-CSDN博客 2.4 Location Events 这次的项目和之…

江西抚州新能源汽车3d扫描零部件逆向抄数测量改装-CASAIM中科广电

汽车改装除了在外观方面越来越受到消费者的青睐&#xff0c;在性能和实用性提升上面的需求也是日趋增多&#xff0c;能快速有效地对客户指定汽车零部件进行一个改装&#xff0c;是每一个汽车改装企业和工程师的追求&#xff0c;也是未来消费者个性化差异化的要求。下面CASAIM中…