建设银行重庆市分行官方网站vs 2008 手机网站开发

news/2025/9/30 17:42:32/文章来源:
建设银行重庆市分行官方网站,vs 2008 手机网站开发,贵州手机网站建设,莱芜论坛都市网目录 概述概念适用场景结构类图 衍化过程业务需求基本的数据访问程序工厂方法实现数据访问程序抽象工厂实现数据访问程序简单工厂改进抽象工厂使用反射抽象工厂反射配置文件衍化过程总结 常见问题总结 概述 概念 抽象工厂模式是一种创建型设计模式#xff0c;它提供了一种将相… 目录 概述概念适用场景结构类图 衍化过程业务需求基本的数据访问程序工厂方法实现数据访问程序抽象工厂实现数据访问程序简单工厂改进抽象工厂使用反射抽象工厂反射配置文件衍化过程总结 常见问题总结 概述 概念 抽象工厂模式是一种创建型设计模式它提供了一种将相关对象组合在一起创建的方式而无需指定具体类。该模式通过定义一个抽象工厂接口来创建一系列相关或依赖的对象而不是直接实例化具体类。这种方式使得系统更加灵活易于扩展和维护。 适用场景 抽象工厂模式适用于以下情况 当一个系统需要独立于其产品的创建、组合和表示时 当一个系统需要由多个系列的产品中的一个进行配置时 当强调一系列相关产品对象的创建和一起使用时 当提供一个产品类库而只想显示它们的接口而不是实现时。 结构 抽象工厂模式包含以下几个角色 抽象工厂Abstract Factory声明了创建一系列产品对象的接口。 具体工厂Concrete Factory实现了抽象工厂接口具体工厂负责创建具体的产品对象。 抽象产品Abstract Product声明了具体产品的接口。 具体产品Concrete Product实现了抽象产品接口具体产品是由具体工厂创建的。 类图 衍化过程 业务需求 假设有一个简单的应用程序它使用了 SQL Server 数据库来存储数据。现在需要将数据库更换为 Access 数据库同时保持应用程序的功能不变。 基本的数据访问程序 客户端直接和qlserverUser耦合 //SqlServer public class SqlServerUser {//新增用户public void insert(User user){System.out.println(在SQlServer中给USER表添加一条数据);}//获取用户信息public User getUser(int id){System.out.println(在SQlServer中根据用户id得到USER表中的一条记录);return null;} }//user表 public class User {private int _id;public int getid(){return this._id;}public void setId(int value){this._idvalue;}private String _name;public String getname(){return this._name;}public void setname(String value){this._namevalue;} }//客户端 public class Client {public static void main(String[] args) {User usernew User();SqlServerUser sunew SqlServerUser();su.insert(user);su.getUser(1);} }在这段客户端代码中可以看到SqlServerUser sunew SqlServerUser();使su这个对象被框死在了SqlServerUser上。     现在要做的就是解除客户端和SqlServerUser 的耦合(简答说就是客户端不再依赖SqlServerUser 那么更换其他的数据库管理系统就不会影响应用程序了) 工厂方法实现数据访问程序 解除客户端和SqlServerUser对象的耦合就是把 new SqlServerUser()封装起来这点上想到使用工厂方法封装new SqlServerUser()过程。 抽出两个接口 //工厂接口 interface IFactory {public IUser creatUserDB();} //数据库接口 public interface IUser {public void insert(User user);public User getUser(int id); }//SqlServerUser 用于访问SqlServer的User public class SqlServerUser implements IUser {//新增用户Overridepublic void insert(User user) {System.out.println(在SQlServer中给USER表添加一条数据);}public User getUser(int id){System.out.println(在SQlServer中根据用户id得到USER表中的一条记录);return null;} } //SqlServerFactory 实例化SqlServerUser public class SqlServerFactory implements IFactory {Overridepublic IUser creatUser() {return new SqlServerUser();} }//客户端 public static void main(String[] args) {Ifactory factorynew SqlServerFactory();User usernew User();IUser iu factory.creatUser();iu.insert(user);iu.getUser(1);}再来看客户端声明IUser接口的对象iu事先并不知道要访问哪个数据库却可以在运行时完成工作这就是业务逻辑和数据访问的解耦(也就是客户端不再依赖SqlServerUser如果需要更换AccessUser只需要创建一个AccessFactory由AccessFactory封装创建AccessUser对象的过程。)     现在又有了新的问题     数据库里如果不是只有一个User表呢该怎么办 抽象工厂实现数据访问程序 现在需要增加一个Department表SqlServer和Access分别操作这个Department表     再抽出一个IDepartment的接口两个工厂了分别增加创建SqlserverDepartment和AccessDepartment的方法 工厂里两个方法可以有不同的实现可以理解为两个不同的系列 //工厂接口 public interface IFactory {public IUser creatUserDB();public IDepartment createDepartment(); } //客户端 public class Client {public static void main(String[] args) {//需要对两个表操作,客户端只认识两个表不认识Access和SQLServerUser user new User();Department department new Department();//需要用哪个DBMS就实例化哪个工厂IFactory factory new SqlServerFactory();//实例化数据库交给对应的工厂IUser iu factory.creatUserDB();//user表里插入读取操作iu.getUser(1);iu.insert(user);IDepartment ideptfactory.createDepartment();//department表里插入读取操作idept.getDepartment(2);idept.insert(department);} }再分析一下需求我们是要读写User表和Department表IUser和IDepartment里有对应的方法也就是干活的是这两个接口的实现类SqlServerUser、AccessUser以及SqlServerDepartment、AccessDepartment那谁负责生产这些实现类的对象呢那就看谁的返回对象是IUser和IDepartment当然是工厂SqlServerFactory和AccessFactory. 抽象工厂的优势现在体现出来了 1、易于交换产品系列 由于具体工厂类例如Factory factorynew AccessFactory0, 在一个应用中只需要在初始化的时候出现一次这就使得改变一个应用的具体工厂变得非常容易它只需要改变具体工厂即可使用不同的产品配置。 我们的设计不能去防止需求的更改那么我们的理想便是让改动变得最小 2、它让具体的创建实例过程与客户端分离这点工厂方法也做到了 客户端是通过它们的抽象接口操纵实例产品的具体类名也被具体工厂的实现分离不会出现在客户代码中。事实上客户端所认识的只有User和Department,至于它是用SQL Server来实现还是Access来实现就不知道了。” 但是仍然存在的问题 1、业务扩充 要增加项目表Project,至少要增加三个类IProject、.SqlserverProject、AccessProject,.还需要更改IFactory、SqlserverFactory和AccessFactory才可以完全实现。对应两个表的两个dbms两个生产dbms的工厂还有两个接口 2、客户端如果多个改动就很多 有很多地方使用IUesr或Department,而这样的设计其实在每一个类的开始都需要声明Factory factorynew SqlserverFactory0,如果有100个调用数据库访问的类就要更改l00次Factory factorynew AccessFactory()这样的代码 简单工厂改进抽象工厂 抽象工厂客户端耦合太多     去掉工厂创建对象交给DateAccess //DataAccess 负责创建具体数据库对象 public class public class DataAccess {private static String dbSqlserver;//可换成Access//创建用户对象工厂public static IUser createUser(){IUser resultnull;switch (db){case Sqlserver:resultnew SqlServerUser();break;case Access:resultnew AccessUser();break;}return result;}//创建部门对象工厂public static IDepartment createDepartment(){IDepartment resultnull;switch (db){case Sqlserver:resultnew SqlServerDepartment();break;case Access:resultnew AccessDepartment();break;}return result;}} {private static String dbSqlserver;//可换成Access//创建用户对象工厂public static IUser createUser(){IUser resultnull;switch (db){case Sqlserver:resultnew SqlServerUser();break;case Access:resultnew AccessUser();break;}return result;}//创建部门对象工厂public static IDepartment createDepartment(){IDepartment resultnull;switch (db){case Sqlserver:resultnew SqlServerDepartment();break;case Access:resultnew AccessDepartment();break;}return result;}}//客户端 public class Client {public static void main(String[] args) {//需要对两个表操作,客户端只认识两个表不认识Access和SQLServerUser user new User();Department department new Department();//实例化数据库交给DataAccessIUser iu DataAccess.createUser();//user表里插入读取操作iu.getUser(1);iu.insert(user);IDepartment ideptDataAccess.createDepartment();//department表里插入读取操作idept.getDepartment(2);idept.insert(department);} }问题     如果需要增加Oracle数据库访问抽象工厂只增加一个OracleFactory工厂类就可以了现在就需要在DataAccess类中每个方法的swicth中加case 改进     不在程序里写明‘如果是Sqlserver就去实例化SQL Server数据库相关类如果是Access就去实例化Access相关类’这样的语句而是根据字符串db的值去某个地方找应该要实例化的类是哪一个。这样就不用switch case了 使用反射抽象工厂 类图只改变DataAccess就可以 public class DataAccess {private static String assemblyNamedesignpatterns.abstractfactory.reflaxAbstractFactoryAccess.DB.;private static String dbSqlServer;//数据库名称可替换为Access//创建用户对象工厂public static IUser createUser(){return (IUser)getInstance(assemblyNamedbUser);}//创建部门对象工厂public static IDepartment createDepartment(){return (IDepartment) getInstance(assemblyNamedbDepartment);}private static Object getInstance(String className){Object resultnull;try {resultClass.forName(className).getDeclaredConstructor().newInstance();}catch(InvocationTargetException e){e.printStackTrace();}catch(NoSuchMethodException e){e.printStackTrace();}catch(InstantiationException e){e.printStackTrace();}catch(IllegalAccessException e){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}return result;}}对象可以根据类路径动态创建了但是在更换数据库访问时还是需要去改程序改db这个字符串的值重编译如果可以不改程序那才是真正地符合开放-封闭原则。 反射配置文件 相对于只用反射属性db数据库名动态获取了 public class DataAccess {private static String assemblyNamedesignpatterns.abstractfactory.profileReflaxAbstractFactoryAccess.DB.;public static String getDb() throws IOException {String result;Properties propertiesnew Properties();properties.load(new FileInputStream(E:\\tgb\\training program\\java\\myProject\\src\\main\\java\\designpatterns\\abstractfactory\\profileReflaxAbstractFactoryAccess\\db.properties));resultproperties.getProperty(db);return result;}//创建用户对象工厂public static IUser createUser() throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {String dbgetDb();return (IUser)getInstance(assemblyNamedbUser);} //反射获取对象public static IDepartment createDepartment() throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {String dbgetDb();return (IDepartment) getInstance(assemblyNamedbDepartment);}private static Object getInstance(String className) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Object resultnull;resultClass.forName(className).getDeclaredConstructor().newInstance(); return result;}}进步     如果更换数据库无须重新编译代码只需要改配置文件就可以。     所有在用简单工厂的地方都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合。”     反射技术可以很好地解决switch 或者if分支难以应对变化难以维护和扩展的诟病。 衍化过程总结 在上面的示例中业务需求是通过数据库连接来执行查询操作。一开始使用了简单的数据访问方式直接在应用程序中编写了连接和查询数据库的代码。 随着业务的发展需要将数据库从 SQL Server 更换为 Access。为了实现这个数据库更换的需求采用了工厂方法模式。通过引入抽象产品IUser和具体产品SqlServerUser和AccessUser抽象工厂IFactory和具体工厂SqlServerFactory和AccessFactory将数据库连接的创建和使用进行了解耦使得代码更加灵活和可扩展。 然后需要增加一个部门表让两个数据库去访问为了应对这种变化引入了抽象工厂模式。通过在具体工厂SqlServerFactory和AccessFactory中增加一个creatDepartment方法解决了创建SqlServerDepartment和AccessDepartment的问题。 后面又为了更加灵活介绍了用简单工厂来改进抽象工厂以及使用反射和配置文件真正实现三高。 每次的变化都是为了应对业务需求的不断变化。最初的简单数据访问方式可能适应了当时的需求但随着业务的发展和技术环境的变化需要更灵活、可扩展的解决方案。工厂方法和抽象工厂模式提供了一种可扩展的设计使得我们能够快速适应业务变化并以相对低的开销进行数据库类型的切换。 常见问题 什么是一系列相关或依赖的对象     一系列相关或相互依赖的对象指的是一组具有共同特征或者相互之间存在某种关联关系的对象集合。这些对象通常有着相似或者相互关联的功能、属性或行为。 如何判断这些对象是一系列相关或相互依赖的呢 共同特征这些对象具有共同的特征或者属性。例如它们可能都实现了同一个接口或者继承了同一个抽象类并拥有类似的方法或属性。 相互关联这些对象之间存在某种关联关系彼此之间相互依赖。例如它们可能是一种逻辑上或功能上相关的对象需要协同工作以完成某个复杂的任务。 执行步骤这些对象在特定的操作过程中需要按照一定的顺序或流程进行调用。它们可能是按照特定的顺序被创建、初始化、配置或者销毁的。 统一管理这些对象可能需要由同一个抽象工厂来创建和管理。抽象工厂可以提供一种统一的方式来创建这些对象确保它们之间的协调性和一致性。 总之一系列相关或相互依赖的对象在抽象工厂模式中是作为一个整体出现的它们具有共同特征、相互关联需要按照一定顺序进行操作并由同一个抽象工厂进行创建和管理。这样可以更好地实现对象之间的协作和组织。 举个栗子 比如有一个一个汽车制造厂可以使用抽象工厂模式来创建一系列相关或相互依赖的对象。 假设汽车制造厂需要生产不同类型的汽车如轿车Sedan和SUVSport Utility Vehicle。每种类型的汽车由多个部件构成包括引擎Engine、底盘Chassis和车身Body等。 在这个例子中可以定义以下抽象类和接口 CarFactory抽象工厂定义了用于创建汽车部件的方法。Engine抽象产品定义了引擎的功能。Chassis抽象产品定义了底盘的功能。Body抽象产品定义了车身的功能。 具体的类可以包括 SedanCarFactory具体工厂实现了CarFactory接口并负责创建轿车相关的部件。 SedanEngine具体产品实现了Engine接口提供了轿车引擎的具体功能。 SedanChassis具体产品实现了Chassis接口提供了轿车底盘的具体功能。 SedanBody具体产品实现了Body接口提供了轿车车身的具体功能。 SuvCarFactory具体工厂实现了CarFactory接口并负责创建SUV相关的部件。 SuvEngine具体产品实现了Engine接口提供了SUV引擎的具体功能。 SuvChassis具体产品实现了Chassis接口提供了SUV底盘的具体功能。 SuvBody具体产品实现了Body接口提供了SUV车身的具体功能。 在这个例子中抽象工厂模式将一系列相关或相互依赖的对象引擎、底盘和车身组合到具体的工厂中轿车工厂和SUV工厂。每个具体工厂负责创建特定类型汽车所需的部件并保证这些部件之间的协调性和一致性。 例如当需要生产一辆轿车时可以使用SedanCarFactory创建引擎、底盘和车身。而当需要生产一辆SUV时可以使用SuvCarFactory创建相应的部件。 通过使用抽象工厂模式汽车制造厂可以轻松扩展以生产不同类型的汽车而无需修改现有代码。同时不同类型的汽车部件之间的依赖关系也得到了良好的管理和维护提高了系统的可维护性和可扩展性。 总结 抽象工厂模式通过引入抽象工厂接口使得客户端代码与具体产品的实现解耦。它提供了一种简单的方式来创建一系列相关的产品对象而无需关心具体的实现细节。通过选择不同的具体工厂可以轻松地切换不同的产品系列以满足不同的需求。抽象工厂模式在大型系统中非常有用它能够提高代码的可维护性、可扩展性和可测试性。

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

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

相关文章

读博期间的工作节奏与身心状态管理经验总结

7-9三个月里连着处理了很多事情的ddl,总结下来是写了两篇论文的大修,一篇会议还有一篇论文的小修。总算是强撑到告一段落,惯例的做一些复盘和总结。 如题,主要是想做两方面问题的分析,第一个是如何有效的管理工作…

郑州网站顾问热狗网淮安市交通建设局网站

文章目录 1. 创建索引2. 插入模拟数据Painless 脚本的基本特点:Painless 脚本的常见用途1. 脚本查询和过滤示例:基于脚本的查询 2. 脚本字段示例:脚本字段 3. 聚合中的脚本示例:脚本聚合 4. 文档更新中的脚本示例:文档…

【Rust GUI开发入门】编写一个本地音乐播放器(7. 制作歌词显示面板) - Jordan

目的是要制作一个这样的面板显示歌词:水平布局:左边30%显示专辑封面 右边70%显示歌词歌词仍然使用ListView来构建,跟前文的歌曲列表一样,代码如下: export component LyricsPanel inherits Window {in property &…

长沙做网站美工的公司网站制度建设模板

当web Service 和 Manifest 被浏览器安装完后,正常情况下,浏览器会提醒用户可将网页安装到桌面。但是通常浏览器都会限制提醒。这时候我们需要手动唤醒浏览器询问用户是否安装到桌面 beforeinstallprompt beforeinstallprompt 事件 window.addEventListe…

做塑料的网站名字潍坊企业网站制作

使用 Redis 可以优化性能,但是存在 Redis 的数据和数据库同步的问题,这是我们需要关注的问题。假设两个业务逻辑都是在操作数据库的同一条记录,而 Redis 和数据库不一致。 Redis 和数据库不一致 在图中,T1 时刻以键 key1 保存数…

深圳商城网站设计公司数字化营销模式及特点

YOLO TT100K: 基于YOLO训练的交通标志检测模型 在原始代码基础上: 修改数据加载类,支持CoCo格式(使用cocoapi);修改数据增强;validation增加mAP计算;修改anchor; 注: 实验开启weig…

html5 自适应网站燕郊建设局网站

目录 打包/解包 作用 zip -r选项 unzip -d选项 如果不使用递归压缩 -l / -v选项 tar 介绍 选项 示例 打包/解包 作用 使多个文件变成一个文件,不易造成数据缺失使下载时间变短 zip 将目录或文件压缩成zip格式 -r选项 递归式压缩某目录及其所有子目录中的文件 如果不…

基于内容可信空间的医疗行业机遇研究报告

基于内容可信空间的医疗行业机遇研究报告pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

建立网站的费用襄阳网站seo

文章目录 概述一、app应用安装白名单核心代码二、app应用安装白名单核心功能分析三、代码实战1.先导入所需要的包2.添加获取白名单方法3.添加限制白名单方法4.上层使用PS:查看当前白名单 总结 概述 在13.0系统rom定制化开发中,客户需求要实现应用安装白名单功能&am…

2025 年智能门锁厂家最新推荐榜单:涵盖高端 / 猫眼 / 家用 / 人脸 / 续航 / 掌静脉等多类型,优质厂家推荐助你选对产品

随着智能家居普及,智能门锁成为家庭安全刚需,但当前市场乱象频发。众多品牌涌入导致产品质量悬殊,部分产品存在指纹识别失误、续航缩水、安全漏洞等问题,甚至有小品牌为降低成本省去核心防护技术,让消费者陷入 “…

2025 年成型机厂商最新权威推荐排行榜:冷弯 / 光伏支架 / 门业等设备企业精度耐用性测评底樑/光伏支架/C型钢/彩钢瓦/快速门成型机厂商推荐

在当前制造业加速升级的背景下,成型机作为建材、门业、新能源等领域的核心生产装备,其品质直接决定下游企业的生产效率与产品竞争力。然而,市场上成型机厂商数量众多,产品质量参差不齐:部分厂商缺乏核心技术,设备…

个人建什么样的网站怎么做网页快照

文章目录 Rust语言之属性宏(Attribute Macro)derive Rust语言之属性宏(Attribute Macro)derive 属性宏是一种基于属性的宏,用于修改、扩展或注解 Rust 代码。它们通常用于为函数、结构体、枚举、模块等添加元数据或自…

自己做的网站点进去很卡即时聊天app开发

摘 要:随着电力需求的不断增加,电力系统供电可靠性要求越来越高,许多供电系统已具备两回或多回供电线路。备用电源自动投入装置可以有效提高供电的可靠性,该类装置能够在工作电源因故障断开后,自动且迅速地将备用电源投…

.Net Core MVC + Vue + SignalR 实现 后端数据主动推送到前端

1. 安装 Microsoft.AspNetCore.SignalR 2. 配置 SignalR 服务public class RandomNumberHub : Hub {/// <summary>/// 前端推送到后端/// </summary>public async Task SendEvent(string number){await C…

2025 布袋包装厂家最新推荐榜:自贸区实力厂商领衔,含手提袋/帆布袋/无纺布袋,年销 500 万级生产商精选

在 “双碳” 目标与 “限塑令” 深化实施的双重推动下,布袋包装市场需求年增速超 20%,但行业乱象始终制约采购决策效率。据调研,67% 的企业曾遭遇样品与成品不符、交货延期等问题,原材料掺假、定制能力不足、环保资…

做网站用的图片分辨率光谷软件园 网站建设

想要生活在幸福的职场中&#xff0c;并非无技巧可寻。以下9个小技巧&#xff0c;帮你收获职场幸福。第1招&#xff1a;按部就班地行动 事业成功的人往往耐得住寂寞&#xff0c;在那些看似程式化的进程当中寻找到快乐&#xff0c;他们是善于自我控制的人&#xff0c;可以让时间听…

做网站用什么配置的笔记本专业做家电经销的网站

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面&#xff1a;有关傅里叶变换的解释太多了&#xff0c;这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

本地广东中山网站建设wordpress眉顶布局

1.遇到问题 公司项目是基于ruoyi 框架快速搭建开发&#xff0c;使用多线程搜索查询&#xff0c;所以以用户区分任务&#xff0c;保证可以搜索任务和取消搜索&#xff0c;所以我这需要获得用户id&#xff0c;使用 SecurityUtils 共工工具类从请求头获取token&#xff0c;然后解…

seo网站优化知识网站如何进行优化设计

文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp…

可以做长页的网站怎么更改网站域名

图像分类是模式识别重要研究领域之一&#xff0c;它的任务是把目标样本分成不同类别&#xff0c;赋予样本相应类别标签。分类实现的基础是用传感器检测到样本的特征&#xff0c;比如形状、颜色、纹理等基本特征或通过基本特征提取更为复杂的特征信息&#xff0c;其中纹理是表示…