《设计模式》抽象工厂模式

1.抽象工厂模式定义

抽象工厂模式(Abstact Factory ): 提供一个创建一系列相关或者相互依赖对象的接口,而无须指定它们具体的类。

1.1 UML图:

在这里插入图片描述

2.抽象工厂模式举例:

业务场景:需要实现一个数据访问程序。

  • 要求支持两种访问方式 access 和 sqlserver
  • 支持两张表 User表和department表

2.1 UML图:

在这里插入图片描述

2.2 核心代码:

IFactory接口

public interface IFactory {public IUser createUser();public IDepartment createDepartment();}

IUser接口

public interface IUser {public void insert(User user);public User getUser(int id);
}

IDepartment接口

public interface IDepartment {public void insert(Department department);public Department getDepartment(int id);
}

AccessFactory

public class AccessFactory implements IFactory {public IUser createUser(){return new AccessUser();}public IDepartment createDepartment(){return new AccessDepartment();}}

SqlserverFactory

public class SqlserverFactory implements IFactory {public IUser createUser(){return new SqlserverUser();}public IDepartment createDepartment(){return new SqlserverDepartment();}}

AccessUser

public class AccessUser implements IUser {//新增一个用户public void insert(User user){System.out.println("在Access中给User表增加一条记录");     }//获取一个用户信息public User getUser(int id){System.out.println("在Access中根据用户ID得到User表一条记录");   return null;  }}

SqlserverUser

public class SqlserverUser implements IUser {//新增一个用户public void insert(User user){System.out.println("在SQL Server中给User表增加一条记录");     }//获取一个用户信息public User getUser(int id){System.out.println("在SQL Server中根据用户ID得到User表一条记录");   return null;  }}

AccessDepartment

public class AccessDepartment implements IDepartment {//新增一个部门public void insert(Department department){System.out.println("在Access中给Department表增加一条记录");     }//获取一个部门信息public Department getDepartment(int id){System.out.println("在Access中根据部门ID得到Department表一条记录");   return null;  }}

SqlserverDepartment

public class SqlserverDepartment implements IDepartment {//新增一个部门public void insert(Department department){System.out.println("在SQL Server中给Department表增加一条记录");     }//获取一个部门信息public Department getDepartment(int id){System.out.println("在SQL Server中根据部门ID得到Department表一条记录");   return null;  }
}

User

public class User {//用户IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//用户姓名private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}

Department

public class Department {//部门IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//部门名称private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}

Client

public class Client {public static void main(String[] args){System.out.println("**********************************************");		System.out.println("抽象工厂模式");System.out.println();		User user = new User();Department department = new Department();IFactory factory = new SqlserverFactory();//IFactory factory = new AccessFactory();IUser iu = factory.createUser();iu.insert(user);    //新增一个用户iu.getUser(1);      //得到用户ID为1的用户信息IDepartment idept = factory.createDepartment();idept.insert(department);    //新增一个部门idept.getDepartment(2);      //得到部门ID为2的用户信息System.out.println();System.out.println("**********************************************");}
}

输出结果:
在这里插入图片描述

3. 抽象工厂模式的优缺点;

3.1 优点

  • 灵活性和可扩展性:
    • 抽象工厂模式允许系统在不修改现有代码的基础上引入新的产品族,提高了系统的可扩展性。
  • 解耦:
    • 客户端代码与具体工厂实现解耦,降低了模块间的依赖。
  • 一致性:
    • 确保了产品族中的对象是一起创建的,从而保证了对象之间的一致性。

3.2 缺点

  • 系统复杂度增加:
    • 每增加一个新的产品族,都需要增加一个新的具体工厂类和产品类,可能会导致系统中类的数量急剧增加。
  • 难以维护:
    • 随着产品族的增加,抽象工厂模式可能会导致系统结构变得更加复杂,难以理解和维护。
  • 不够灵活:
    • 如果系统需要支持多种产品族的任意组合,抽象工厂模式可能不如其他模式(如建造者模式)灵活。

6. 总结

抽象工厂模式(Abstact Factory ): 提供一个创建一系列相关或者相互依赖对象的接口,而无须指定它们具体的类。

7.参考

  • https://cloud.tencent.com/developer/article/2478362
  • https://blog.csdn.net/m0_46248770/article/details/149914634

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

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

相关文章

git stash临时保存工作区

通过git stash 可以灵活管理临时修改,保持工作区整洁,是多人协作或多任务切换时的常用工具,主要用于临时保存工作区和暂存区修改的命令,常用于以下场景:(1)需要切换分支,但不想立即提…

Vue 3.5+ Teleport defer 属性详解:解决组件渲染顺序问题的终极方案

📋 概述 Vue 3.5 引入了 Teleport 的 defer 属性,这是一个重要的延迟解析特性。传统的 Teleport 在组件挂载时会立即解析目标容器,而 defer 属性允许推迟 Teleport 的目标解析,直到应用的其他部分挂载完成。 ⚠️ 传统 Teleport …

【102页PPT】某著名企业智能制造解决方案及智能工厂产品介绍(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91662620 资料解读:某著名企业智能制造解决方案及智能工厂产品介绍 详细资料请看本解读文章的最后内容 智能制造背景与整体规划…

Revisiting Character-level Adversarial Attacks for Language Models

文章目录**核心设计目标****关键步骤与实现细节**1. **候选位置选择(Algorithm 1: get_top_locations)**2. **扰动生成与筛选(Algorithm 2: Charmer)**3. **适配大语言模型(LLM)的攻击****实验中的性能表现…

(一)Python + 地球信息科学与技术 (GeoICT)=?

目录 引子 一、核心定位:Python 为何能重塑 GeoICT? 二、Python 在 GeoICT 中的关键应用领域 1. 空间数据处理(GIS 基础) 2. 遥感图像处理与解译 3. 空间分析与建模 4. 地学数据可视化 5. 时空大数据分析 三、Python GeoI…

OpenAI 发布了 GPT-5,有哪些新特性值得关注?国内怎么使用GPT5?

GPT-5很强,在LMAreana上获得了1481分,超过Gemini 2.5 Pro,夺回第一。 国内怎么使用GPT5?-> zhangfeidezhu.com/?p1033 这次发布的GPT-5系列包含三个模型: GPT-5:适合复杂推理、广泛的世界知识&#x…

PowerPoint和WPS演示放映PPT时如何禁止鼠标翻页

在演示播放PPT的时候,我们有时候会用鼠标在幻灯片上划重点,一不小心就点击了鼠标左键,而默认的鼠标左键是向下翻页(下一步)。可以简单设置一下,禁用鼠标翻页的功能,改为其他方式翻页。一、禁用/…

基于springboot养老院管理系统 毕业论文+项目源码及数据库文件

!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:优创学社 💕💕个人简介:本人在读博士研究生,拥有多年程序开…

Meteodyn WT 6.7(Meteodyn)风力资源评估及微观选址软件工具

Meteodyn WT 6.7(Meteodyn)风力资源评估及微观选址软件工具,基于计算流体力学(CFD)技术,主要用于复杂地形下的风能评估和风电场选址。该软件由法国政府环境与能源署(ADEME)支持开发&…

计算机网络 TCP time_wait 状态 详解

TCP 的 TIME_WAIT 状态是 TCP 连接终止过程中 主动关闭连接的一方(通常是先调用 close() 或主动发送 FIN 的一端)进入的一个重要状态。理解其原理、副作用和优化策略对高性能网络编程和服务器调优至关重要。🔍 一、TIME_WAIT 是什么&#xff…

《GuardHFL: Privacy Guardian for Heterogeneous Federated Learning》——论文阅读

研究背景:异构联邦中各客户端模型结构,精度,算力都不同,无法像传统联邦那样共享梯度,只能通过“查询-响应”使用辅助数据来训练模型。这种方法存在严重隐私问题:直接共享查询样本会泄露敏感信息&#xff0c…

Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot

引子 当 LLM 的浪潮以不可阻挡之势席卷全球,从改变用户交互到重塑商业模式,我们每一位开发者都身处这场技术变革的中心。作为庞大的 Java 生态中的一员,你是否也曾思考:当 Python 似乎成为 AI 的“官方语言”时,我们这…

pycharm2025导入anaconda创建的各个AI环境

目录1.pycharm下载及安装2.导入anaconda的环境到pycharm项目中1.pycharm下载及安装 建议从官网下载,不要乱下载。 https://www.jetbrains.com.cn/en-us/pycharm/ 右上角可以切换中英文,在此切换为中文。 点击下载,如下页面: 点击中间下载w…

获取IPv6地址的三种方式

DHCPv6无状态自动分配IP地址Server 配置&#xff1a;<Huawei>system-view[Huawei]ipv6[Huawei]dhcp enable[Huawei]dhcpv6 pool pool1[Huawei-dhcpv6-pool-pool1]dns-server 2002::2[Huawei-dhcpv6-pool-pool1]dns-domain-name example.com[Huawei-dhcpv6-pool-pool1]qui…

[Oracle数据库] Oracle 复杂查询

对于刚接触 Oracle 数据库的初学者来说&#xff0c;简单查询&#xff08;如SELECT * FROM 表名&#xff09;可能不难掌握&#xff0c;但面对复杂业务场景时&#xff0c;就需要更强大的查询能力。本文将围绕 Oracle 复杂查询的核心知识点展开&#xff0c;包括条件逻辑、分组函数…

Redis-plus-plus API使用指南:通用操作与数据类型接口介绍

&#x1f351;个人主页&#xff1a;Jupiter.&#x1f680; 所属专栏&#xff1a;Redis 欢迎大家点赞收藏评论&#x1f60a;目录通用 API连接 Redis1. get/set2. exists 方法3. del 方法4. keys 方法5. expire 方法6. ttl 方法7. type 方法8. flushall 方法String 类型 API1. ge…

基于遗传编程的自动程序生成

这里写目录标题核心概念与工作原理1. 个体表示&#xff1a;树结构2. 初始化种群3. 适应度评估4. 选择5. 遗传操作&#xff08;繁殖&#xff09;6. 新一代种群形成7. 终止条件基于遗传编程的符号回归示例问题示例GP实现符号回归&#xff08;Deap&#xff09;GP实现符号回归&…

flowable汇总查询方式

背景&#xff1a;小程序开发申请流程。使用flowable流程框架。用户需要在后台统揽用户申请的汇总表。 设计思路&#xff1a;通过查询流程实例分页查询获取数据&#xff0c; 其中可以通过查询条件进行查询&#xff0c;查询条件是流程申请时添加到流程变量当中的&#xff0c;方便…

力扣438:找到字符串中所有的字母异位词

力扣438:找到字符串中所有的字母异位词题目思路代码题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 思路 我们先不看异位词这个条件&#xff0c;如何在字符串s中找到字符串p。我们可以…

ruoyi-vue(十一)——代码生成

大部分项目里其实有很多代码都是重复的&#xff0c;几乎每个基础模块的代码都有增删改查的功能&#xff0c;而这些功能都是大同小异&#xff0c; 如果这些功能都要自己去写&#xff0c;将会大大浪费我们的精力降低效率。所以这种重复性的代码可以使用代码生成。一 代码生成使用…