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

设计模式-创建型模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。

由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产。

sqlServerFactory和AccessFactory都能查询部门表和用户表,选择sqlServerFactory采用sqlserver获取数据,选择AccessFactory采用Access获取数据。

类比上图,猫工厂和狗工厂都能产生动物和食物,选择猫工厂产生猫和猫粮,选择狗工厂产生狗和狗粮。 

首先,定义产品的接口:
// 抽象产品A:动物
public interface Animal {void makeSound();
}// 抽象产品B:食物
public interface Food {void eat();
}然后,创建实现这些接口的具体产品类:
// 具体产品A1:狗
public class Dog implements Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}// 具体产品A2:猫
public class Cat implements Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}// 具体产品B1:狗粮
public class DogFood implements Food {@Overridepublic void eat() {System.out.println("吃狗粮");}
}// 具体产品B2:猫粮
public class CatFood implements Food {@Overridepublic void eat() {System.out.println("吃猫粮");}
}
接下来,定义抽象工厂接口,其中包含创建产品的方法:
// 抽象工厂
public interface AnimalFactory {Animal createAnimal();Food createFood();
}
然后,创建实现了抽象工厂接口的具体工厂类:
// 具体工厂A:狗工厂
public class DogFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Dog();}@Overridepublic Food createFood() {return new DogFood();}
}// 具体工厂B:猫工厂
public class CatFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}@Overridepublic Food createFood() {return new CatFood();}
}
最后,客户端代码使用具体工厂类来创建产品对象,并调用它们的方法:
public class Client {public static void main(String[] args) {// 创建狗工厂AnimalFactory dogFactory = new DogFactory();Animal dog = dogFactory.createAnimal();Food dogFood = dogFactory.createFood();dog.makeSound(); // 输出:汪汪汪dogFood.eat(); // 输出:吃狗粮// 创建猫工厂AnimalFactory catFactory = new CatFactory();Animal cat = catFactory.createAnimal();Food catFood = catFactory.createFood();cat.makeSound(); // 输出:喵喵喵catFood.eat(); // 输出:吃猫粮}
}

如果增加一个牛,需要添加牛工厂,牛,牛粮等才能实现。

这样做改动太大,太过笨拙,选择配置文件+反射+简单工厂+抽象工厂来实现

 DataAccess类,用反射技术,取代IFactory、SqlserverFactory和AccessFactory。

sqlserver可采用读取配置文件的方式赋值。确定db后利用反射加载相应的类去除if,解除分支判断带来的耦合

 

相关文章:

设计模式-创建型模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…...

【Go】五、Grpc 的入门使用

grpc 与 protobuf grpc 使用的是 protobuf 协议,其是一个通用的 rpc 框架,基本支持主流的所有语言、其底层使用 http/2 进行网络通信,具有较高的效率 protobuf 是一种序列化格式,这种格式具有 序列化以及解码速度快(…...

PDF加粗内容重复读取解决方案

文章目录 前言发现问题解决方案问题分析大致逻辑 show my code 前言 在使用pdfplumber读取PDF的过程中,由于加黑的内容会被莫名其妙的读取两次,带来了很大的困扰。这篇文章将给出解决方案。 发现问题 在在使用pdfplumber读取PDF的过程中,读…...

Golang 并发 Channel的用法

目录 Golang 并发 Channel的用法1. channel 的创建2. nil channel读写阻塞示例close示例 3. channel 的读写4. channel 只读只写5. 关闭channelchannel关闭后,剩余的数据能否取到读取关闭的channel,将获取零值使用ok判断,是否关闭使用for-ran…...

cfa复习资料介绍之二:notes(SchweserNotes)

什么是CFA notes? CFA资料Study Notes都是外国一些出版机构针对CFA考试提供的复习资料,而其中Schweser在国内的名气最大,用的人也最多。内容详尽并且突出重点,并且CFA Notes的内容相比于官方curriculum教材更加符合中国CFA考生的心态&#x…...

FITC Palmitate Conjugate,FITC-棕榈酸酯缀合物,可以用标准 FITC 滤光片组进行成像

FITC Palmitate Conjugate,FITC-棕榈酸酯缀合物,可以用标准 FITC 滤光片组进行成像 您好,欢迎来到新研之家 文章关键词:FITC Palmitate Conjugate,FITC-棕榈酸酯缀合物,FITC 棕榈酸酯缀合物,F…...

本机防攻击简介

定义 在网络中,存在着大量针对CPU(Central Processing Unit)的恶意攻击报文以及需要正常上送CPU的各类报文。针对CPU的恶意攻击报文会导致CPU长时间繁忙的处理攻击报文,从而引发其他业务的中断甚至系统的中断;大量正常…...

Python 进阶语法:JSON

1 什么是 JSON? 1.1 JSON 的定义 JSON 是 JavaScript Object Notation 的简写,字面上的意思是 JavaScript 对象标记。本质上,JSON 是轻量级的文本数据交换格式。轻量级,是拿它与另一种数据交换格式XML进行比较,相当轻…...

mescroll 在uni-app 运行的下拉刷新和上拉加载的组件

官网传送门: https://www.mescroll.com/uni.html 最近使用到了mescroll 但是一直都是整个页面的滚动, 最近需求有需要局部滚动, 收藏了一个博主的文章觉得写的还挺好, 传送门: https://blog.csdn.net/Minions_Fatman/article/details/134754926?spm1001.2014.3001.5506 使用…...

netty的TCP服务端和客户端实现

第一步&#xff1a;引入依赖 <dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.90.Final</version></dependency></dependencies> 第二步&#xff1a;实…...

合纵连横 – 以 Flink 和 Amazon MSK 构建 Amazon DocumentDB 之间的实时数据同步

在大数据时代&#xff0c;实时数据同步已经有很多地方应用&#xff0c;包括从在线数据库构建实时数据仓库&#xff0c;跨区域数据复制。行业落地场景众多&#xff0c;例如&#xff0c;电商 GMV 数据实时统计&#xff0c;用户行为分析&#xff0c;广告投放效果实时追踪&#xff…...

HBase 进阶

参考来源: B站尚硅谷HBase2.x 目录 Master 架构RegionServer 架构写流程MemStore Flush读流程HFile 结构读流程合并读取数据优化 StoreFile CompactionRegion Split预分区&#xff08;自定义分区&#xff09;系统拆分 Master 架构 Master详细架构 1&#xff09;Meta 表格介…...

一周学会Django5 Python Web开发-Django5路由命名与反向解析reverse与resolve

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…...

好奇!为什么gateway和springMVC之间依赖冲突?

Gateway和SpringMVC之间存在冲突&#xff0c;可能是因为它们分别基于不同的技术栈。具体来说&#xff1a; 技术栈差异&#xff1a;Spring Cloud Gateway 是建立在 Spring Boot 2.x 和 Spring WebFlux 基础之上的&#xff0c;它使用的是非阻塞式的 Netty 服务器。而 Spring MVC…...

一些内网渗透总结

windows命令收集 信息收集: 查看系统版本和补丁信息: systeminfo 查看系统开放端口: netstat -ano 查看系统进程: tasklist /svc 列出详细进程: tasklist /V /FO CSV 查看ip地址和dns信息: ipconfig /all 查看当前用户: whoami /user 查看计算机用户列表: net user 查看计算机…...

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字…...

深度学习系列60: 大模型文本理解和生成概述

参考网络课程&#xff1a;https://www.bilibili.com/video/BV1UG411p7zv/?p98&spm_id_frompageDriver&vd_source3eeaf9c562508b013fa950114d4b0990 1. 概述 包含理解和分类两大类问题&#xff0c;对应的就是BERT和GPT两大类模型&#xff1b;而交叉领域则对应T5 2.…...

SpringBoot 使用 JWT 保护 Rest Api 接口

用 spring-boot 开发 RESTful API 非常的方便&#xff0c;在生产环境中&#xff0c;对发布的 API 增加授权保护是非常必要的。现在我们来看如何利用 JWT 技术为 API 增加授权保护&#xff0c;保证只有获得授权的用户才能够访问 API。 一、Jwt 介绍 JSON Web Token (JWT)是一个开…...

大蟒蛇(Python)笔记(总结,摘要,概括)——第10章 文件和异常

目录 10.1 读取文件 10.1.1 读取文件的全部内容 10.1.2 相对文件路径和绝对文件路径 10.1.3 访问文件中的各行 10.1.4 使用文件的内容 10.1.5 包含100万位的大型文件 10.1.6 圆周率中包含你的生日吗 10.2 写入文件 10.2.1 写入一行 10.2.2 写入多行 10.3 异常 10.3.1 处理Ze…...

使用JDBC操作数据库(IDEA编译器)

目录 JDBC的本质 ​ JDBC好处 JDBC操作MySQL数据库 1.创建工程导入驱动jar包 2.编写测试代码 ​相关问题 JDBC的本质 官方(sun公司) 定义的一套操作所有关系型数据库的规则&#xff0c;即接口各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包我们可以使用这…...

Qwen3.5-2B图文理解教程:GIF动图逐帧理解+动态内容总结生成方法

Qwen3.5-2B图文理解教程&#xff1a;GIF动图逐帧理解动态内容总结生成方法 1. 引言 Qwen3.5-2B是一款轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这款模型主打低功耗、低门槛部署&#xff0c;特别适配端侧和边缘设备&am…...

Excel VBA实战:打造高精度自定义计时器

1. 为什么需要自定义计时器&#xff1f; 在实验室数据采集、运动训练计时、工业生产监控等场景中&#xff0c;我们经常需要精确记录时间间隔。虽然Excel自带的时间函数能解决部分需求&#xff0c;但遇到以下情况时&#xff0c;原生功能就显得力不从心&#xff1a; 毫秒级精度要…...

Wan2.2-I2V-A14B效果展示:复杂提示词‘雨夜霓虹街道行人撑伞行走’生成效果

Wan2.2-I2V-A14B效果展示&#xff1a;复杂提示词雨夜霓虹街道行人撑伞行走生成效果 1. 模型能力概览 Wan2.2-I2V-A14B是一款专为高质量视频生成设计的先进模型&#xff0c;能够将文字描述转化为生动的动态画面。这款模型特别擅长处理复杂场景和细腻氛围的渲染&#xff0c;在以…...

华为 eNSP 安装全攻略:Windows 11 25H2 完美适配

本教程适用范围 ✅ Windows 7&#xff08;所有版本&#xff09;✅ Windows 10&#xff08;所有版本&#xff09;✅ Windows 11 23H2 及以下✅ Windows 11 24H2&#xff08;OS 内部版本 ≥ 26100.3624&#xff09;✅ Windows 11 25H2❌ Windows 11 24H2&#xff08;OS 内部版本…...

番茄小说下载器:Rust构建的高性能离线阅读解决方案

番茄小说下载器&#xff1a;Rust构建的高性能离线阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代&#xff0c;网络依赖、格式不兼容和下载效率低下…...

新手福音:基于预置镜像,在快马平台零配置开启Python Web开发之旅

作为一个刚接触Python Web开发的新手&#xff0c;我最近在InsCode(快马)平台上体验了一把零配置搭建个人博客的过程。不得不说&#xff0c;这种基于预置镜像的开发方式&#xff0c;简直是为我们这些初学者量身定制的福音。下面我就来分享一下这次的学习心得。 为什么选择预置镜…...

音频驱动面部动画:Audio2Face技术原理与实践指南

音频驱动面部动画&#xff1a;Audio2Face技术原理与实践指南 【免费下载链接】FACEGOOD-Audio2Face http://www.facegood.cc 项目地址: https://gitcode.com/gh_mirrors/fa/FACEGOOD-Audio2Face 在虚拟人技术快速发展的今天&#xff0c;面部动画的自然度成为提升用户体验…...

STM32水质监测系统开发与物联网应用

1. 项目概述 作为一名嵌入式开发工程师&#xff0c;我最近完成了一个基于STM32的河流水质监测系统项目。这个系统能够实时检测水体的PH值、电导率和浊度等关键参数&#xff0c;并通过物联网技术实现远程监控和自动调节功能。在实际应用中&#xff0c;我发现这套系统特别适合用于…...

Linux调试信息双输出:script与tee工具详解

1. Linux调试信息双输出方案概述在Linux系统开发过程中&#xff0c;调试信息的输出管理是每个开发者都会遇到的常规需求。默认情况下&#xff0c;使用printf等函数输出的调试信息会直接显示在终端&#xff08;标准输出stdout&#xff09;上。但在实际开发场景中&#xff0c;我们…...

Kimi-VL-A3B-Thinking效果展示:MMLongBench-Doc 35.1分超长文档理解

Kimi-VL-A3B-Thinking效果展示&#xff1a;MMLongBench-Doc 35.1分超长文档理解 1. 模型概述 Kimi-VL-A3B-Thinking是一款创新的开源混合专家&#xff08;MoE&#xff09;视觉语言模型&#xff0c;在多模态理解和长上下文处理方面展现出卓越能力。这个模型最引人注目的特点是…...