Java设计模式之抽象工厂模式详解

Java设计模式之抽象工厂模式详解

大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的篇章中,我们将探索Java设计模式的一种奇妙魔法——抽象工厂模式。通过深入解析这个让代码创造变得如此奇妙的模式,为你揭开代码世界中的神秘面纱。

什么是抽象工厂模式?

抽象工厂模式是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式与工厂方法模式相似,但不同之处在于它可以创建多个产品的产品族。

抽象工厂模式的核心思想

  • 提供接口: 定义产品族的接口,包括多个产品的创建方法。
  • 实现工厂: 创建多个工厂类,每个工厂类负责实现接口,生成产品族的不同产品。
  • 应对变化: 允许系统在不修改客户端代码的情况下更换不同产品族。

如何实现抽象工厂模式

抽象工厂模式的基本结构

// 抽象产品A
public interface ProductA {void create();
}// 具体产品A1
public class ConcreteProductA1 implements ProductA {@Overridepublic void create() {System.out.println("创建具体产品A1");}
}// 具体产品A2
public class ConcreteProductA2 implements ProductA {@Overridepublic void create() {System.out.println("创建具体产品A2");}
}// 抽象产品B
public interface ProductB {void create();
}// 具体产品B1
public class ConcreteProductB1 implements ProductB {@Overridepublic void create() {System.out.println("创建具体产品B1");}
}// 具体产品B2
public class ConcreteProductB2 implements ProductB {@Overridepublic void create() {System.out.println("创建具体产品B2");}
}// 抽象工厂接口
public interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}

具体工厂的实现

// 具体工厂1
public class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2
public class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}

抽象工厂模式的实际应用场景

UI控件库

在UI控件库中,抽象工厂模式可以用来创建不同风格的UI控件。

// 抽象按钮
public interface Button {void display();
}// 具体按钮A
public class WindowsButton implements Button {@Overridepublic void display() {System.out.println("显示Windows风格按钮");}
}// 具体按钮B
public class LinuxButton implements Button {@Overridepublic void display() {System.out.println("显示Linux风格按钮");}
}// 抽象文本框
public interface TextBox {void display();
}// 具体文本框A
public class WindowsTextBox implements TextBox {@Overridepublic void display() {System.out.println("显示Windows风格文本框");}
}// 具体文本框B
public class LinuxTextBox implements TextBox {@Overridepublic void display() {System.out.println("显示Linux风格文本框");}
}// 抽象UI控件工厂
public interface UIControlFactory {Button createButton();TextBox createTextBox();
}

数据库连接池

在数据库连接池中,抽象工厂模式可以用来创建不同类型的数据库连接池。

// 抽象数据库连接池
public interface ConnectionPool {void getConnection();
}// 具体Oracle数据库连接池
public class OracleConnectionPool implements ConnectionPool {@Overridepublic void getConnection() {System.out.println("获取Oracle数据库连接");}
}// 具体MySQL数据库连接池
public class MySQLConnectionPool implements ConnectionPool {@Overridepublic void getConnection() {System.out.println("获取MySQL数据库连接");}
}// 抽象数据库连接池工厂
public interface ConnectionPoolFactory {ConnectionPool createConnectionPool();
}

结语

通过本文的深入解析,我们探索了Java设计模式中的抽象工厂模式。这个奇妙的魔法能够让代码创造变得如此灵活,既能适应不同的产品族,又能够轻松适应系统的变化。让我们在代码的创造过程中,深刻领略抽象工厂模式的设计魅力,创造更为优雅、灵活的代码大观!

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

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

相关文章

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

【RT-DETR有效改进】华为 | GhostnetV2移动端的特征提取网络效果完爆MobileNet系列

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

QGraphicsView 如何让图形大小适配窗口

1. setSceneRect 做什么用? setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。 QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定…

自动控制原理——数学模型建立

目标 1.数学模型概念 描述系统输入、输出变量以及内部个变量之间的关系的数学表达式 2.建模方法 解析法(机理解析法): 根据系统工作所依据的物理定律写运动方程 实验法(系统辨识法): 给系统施加某种测试信号&am…

万户 ezOFFICE wf_process_attrelate_aiframe.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Intel开发环境Quartus、Eclipse与WSL的安装

PC :win10 64bit 安装顺序:先安装Quartus 21.4,接着Eclipse或者WSL(Windows Subsystem for Linux),Eclipse与WSL的安装不分先后。 为什么要安装Eclipse? 因为Eclipse可以开发基于Nios II的C/…

SwiftUI 框架有哪些主要优势

SwiftUI是苹果公司在2019年推出的一种用于构建用户界面的框架,它使用Swift语言编写,并且与iOS、iPadOS、macOS、watchOS和tvOS等平台兼容。下面简单的看下有哪些主要的优势。 声明式的界面描述 使用声明式编程风格,通过简洁的代码描述用户界…

力扣645.错误的集合

一点一点地刷,慢慢攻克力扣!! 王子公主请看题 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数…

C++:基于C的语法优化

C:基于C的语法优化 命名空间命名空间域域作用限定符展开命名空间域 输入输出缺省参数全缺省参数半缺省参数 函数重载参数类型不同参数个数不同参数类型的顺序不同 引用基本语法按引用传递返回引用引用与指针的区别 内联函数autoauto与指针和引用结合 范围for循环nul…

红队打靶练习:W34KN3SS: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、gobuster 5、dirsearch WEB web信息收集 目录探测 漏洞利用 openssl密钥碰撞 SSH登录 提权 get user.txt get passwd 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB…

常用的目标跟踪有哪些

目标跟踪是计算机视觉领域的一个重要研究方向,主要用于实现视频监控、人机交互、智能交通等领域。下面介绍几种常用的目标跟踪方法: 特征匹配法 特征匹配法是目标跟踪中最基本的方法之一,其基本原理是通过提取目标的特征,然后在…

羊驼系列大模型LLaMa、Alpaca、Vicuna

羊驼系列大模型:大模型的安卓系统 GPT系列:类比ios系统,不开源 LLaMa让大模型平民化 LLaMa优势 用到的数据:大部分英语、西班牙语,少中文 模型下载地址 https://huggingface.co/meta-llama Alpaca模型 Alpaca是斯…

java枚举详细解释

枚举的基本认识 我们一般直接定义一个单独的枚举类 public enum 枚举类名{枚举项1,枚举项2,枚举项3 } 可以通过 枚举类名.枚举项 来访问该枚举项的 - 可以理解为 枚举项就是我们自己定义的一个数据类型,是独一无二的 接下来我们直接用一个例子来完全理解 加深理解 这里…

【flash基础】常见术语1

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

接口可以继承另一个接口吗?Java的本地方法是什么?

是的,在Java、C#等面向对象编程语言中,接口是可以继承另一个接口的。这允许创建一个更加具体的接口,它除了包含自己定义的方法签名外,还可以继承父接口中的所有方法签名。这样可以更好地实现代码复用和组织功能。例如,…

【Java 设计模式】结构型之代理模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的…

VScode代码查找、替换

快捷方法按CtrlF Mac为CommandF 右上角出现的框就是查找框,可以输入想找的内容 点击左边的小尖儿,输入替换的内容后 按回车是替换一个,按Ctrl回车(Command回车)是全替换,点击右边那两个图案也可以&#x…

DHCP配置(路由器,交换机)

DHCP接口地址池配置 拓扑 PC配置DHCP点击应用。 路由器配置命令 <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]int g0/0/1[Huawei-GigabitEthernet0/0/1]ip address 10.1.1.1 24[Huawei-GigabitEthernet0/0/1]q[Huawei]dhcp enable Info: T…

DBA技术栈MongoDB: 索引和查询优化

2.1 批量插入数据 单条数据插入db.collection.insertOne()多条数据插入db.collection.insertMany() db.inventory.insertMany( [{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },{ item: "notebook"…

算法竞赛基础:C++双向链表的结构和实现(普通链表、List、静态链表)

算法竞赛基础&#xff1a;双向链表 本文将会介绍在算法竞赛中双向链表的几种使用方式&#xff0c;适合有一定基础的人阅读。 双向链表的结构 一般来说&#xff0c;普通的链表结构是这样的&#xff1a; struct node {int num;node *next; }next指针指向下一个链表&#xff…