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

抽象工厂模式(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,解除分支判断带来的耦合

 

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

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

相关文章

stm32——hal库学习笔记(DAC)

这里写目录标题 一、DAC简介(了解)1.1,什么是DAC?1.2,DAC的特性参数1.3,STM32各系列DAC的主要特性 二、DAC工作原理(掌握)2.1,DAC框图简介(F1)2.2…

《穿越科技的前沿:计算机专业必看的电影盛宴》

文章目录 每日一句正能量前言电影推荐推荐一:《黑客帝国》推荐二:《社交网络》推荐三:《源代码》推荐四:《谍影重重》系列推荐五:《旋转木马》 技术与主题后记 每日一句正能量 一个人的一生,就是一座有了年…

探索Go语言中的HTTP路由和中间件

在Go语言中,HTTP路由和中间件是实现Web应用程序核心功能的关键组件。路由负责将传入的HTTP请求分发到适当的处理函数,而中间件则提供了一种在请求处理过程中插入额外逻辑的机制。 HTTP路由 在Go中,net/http标准库提供了基本的路由功能&…

红队-主机发现端口扫描

NMAP扫描(kali) 查看nmap帮助 nmap --help 主机发现,扫描整个C段 sudo nmap -sn 192.168.2.0/24 端口扫描,最小速度10000,扫描全部端口(-p-) sudo nmap --min-rate 10000 -p- 192.168.200.24410000是权衡过的速度…

WebGIS开发技术岗真实面经分享!

24春招在即,很多人都已经在开始踏上面试的征程 面对日益严峻的就业环境,想获得更好的工作机会,没有捷径可走,只有不断提升才是硬道理。在此小编分享几个网友GIS开发岗真实的面试经历,希望对正在求职的你,有…

六、回归与聚类算法 - 线性回归

目录 1、线性回归的原理 1.1 应用场景 1.2 什么是线性回归 1.2.1 定义 1.2.2 线性回归的特征与目标的关系分析 2、线性回归的损失和优化原理 2.1 损失函数 2.2 优化算法 2.2.1 正规方程 2.2.2 梯度下降 3、线性回归API 4、回归性能评估 5、波士顿房价预测 5.1 流…

Nginx 和 Apache 的比较

Nginx和Apache的对比 Nginx和Apache的优缺点比较 (1)nginx相对于apache的优点 ①轻量级,同样起web服务,比apache占用更少的内存及资源 ②抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(二)--目标识别

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接:https://github.com/zzhmx/yolov5-tracking-xxxsort.git 先按照之前的博客配置好环境: yolov5-tracking-xxxsort yolov5融合六种跟踪算法(一)–环境配…

【快速搞定Webpack5】处理样式资源(三)

本次内容我们将学习使用webpack如何处理css、less、sass、scss等样式资源 介绍 webpack本身是不能识别样式资源的,所以我们需要借助loader包来帮助webpack解析样式资源 我们找loader都应该去官方文档中查找对应的loader,然后学习使用。 官方文档找不到…

Linux中安装Nginx及日常配置使用

高性能的http服务器/反向代理服务器。官方测试支持5万并发,CPU、内存等消耗较低且运行稳定 使用场景 Http服务器。 Nginx可以单独提供Http服务,做为静态网页的服务器。虚拟主机。 可以在一台服务器虚拟出多个网站。反向代理与负载均衡。 Nginx做反向代理…

LaWGPT—基于中文法律知识的大模型

文章目录 LaWGPT:基于中文法律知识的大语言模型数据构建模型及训练步骤两个阶段二次训练流程指令精调步骤计算资源 项目结构模型部署及推理 LawGPT_zh:中文法律大模型(獬豸)数据构建知识问答模型推理训练步骤 LaWGPT:基…

c++用户管理信息(双向链表)

c用户管理信息---双向链表 ListStu双向链表--(把前面的单链表改一下,就直接可以用)ListStu.hListStu.cpp ListStu双向链表–(把前面的单链表改一下,就直接可以用) ListStu.h #pragma once #include "…

yarn常用命令小记

安装 npm install -g yarn查看版本 yarn -v初始化项目与依赖管理 yarn init&#xff1a;与npm init一样通过交互式会话生成一个新的package.jason文件以初始化项目&#xff1b;跳过会话可使用yarn init --yes&#xff0c;简写yarn init -yyarn add <package><versi…

【转载】企业资产收集与脆弱性检查工具

简介 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户管理互联网资产攻击面的 SaaS 化订阅服务产品。可实现对备案域名、子域名、IP、端口、服务、网站、漏洞、安全风险等场景进行周期性监控&#xff0c;支持多维度分析攻击面。利用可视化…

java 中开源的html解析库Jsoup 简单例子

下面是一个使用Jsoup库解析HTML的简单Java例子。这个例子展示了如何使用Jsoup从一个HTML字符串中提取数据。 首先&#xff0c;确保你已经将Jsoup作为依赖项添加到你的项目中。如果你使用的是Maven&#xff0c;可以在pom.xml文件中添加以下依赖&#xff1a; &…

《图解设计模式》笔记(一)适应设计模式

图灵社区 - 图解设计模式 - 随书下载 评论区 雨帆 2017-01-11 16:14:04 对于设计模式&#xff0c;我个人认为&#xff0c;其实代码和设计原则才是最好的老师。理解了 SOLID&#xff0c;如何 SOLID&#xff0c;自然而然地就用起来设计模式了。Github 上有一个 tdd-training&…

【达梦数据库】通过系统函数来配置sqllog

环境说明&#xff1a;达梦2024年Q4季度版之后版本支持 通过系统函数进行sqllog参数配置 -- 新增模式 SLOG_CONFIG1 和 SLOG_CONFIG2&#xff1a; SP_SET_SQLLOG_INI([SLOG_CONFIG1]FILE_PATH../log;PART_STOR0;[SLOG_CONFIG2]SWITCH_MODE2;SWITCH_LIMIT128);-- 删除模式名为 S…

redis复习笔记06(小滴课堂)

分布式锁核心知识介绍和注意事项 基于Redis实现分布式锁的几种坑 综合伪代码&#xff1a; 运行&#xff1a;

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

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

LLaMA 2 - 你所需要的一切资源

摘录 关于 LLaMA 2 的全部资源&#xff0c;如何去测试、训练并部署它。 LLaMA 2 是一个由 Meta 开发的大型语言模型&#xff0c;是 LLaMA 1 的继任者。LLaMA 2 可通过 AWS、Hugging Face 等提供商获取&#xff0c;并免费用于研究和商业用途。LLaMA 2 预训练模型在 2 万亿个标记…