




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
抽象工厂 AbstractFactory 模式 换DB的例子 从使用Acess换为使用SqlServer从SqlServer换为Oracle由于数据库使用的命名空间不同 用到的方法不同 所以很难直接替换 往往要用时间摆平 模拟数据库访问例子 classUser privateint id publicintID get return id set id value privatestring name publicstringName get return name set name value User表 操作User表 classSqlserverUser publicvoidInsert Useruser Console WriteLine 在Sqlserver中给User表增加一条记录 publicUserGetUser intid Console WriteLine 在Sqlserver中根据ID得到User表一条记录 returnnull 客户端代码 classProgram staticvoidMain string args Useruser newUser SqlserverUsersu newSqlserverUser su Insert user su GetUser 1 Console Read su对象被框死在SqlServer上了 再换数据库时 不够灵活 考虑多态 用工厂方法模式的数据访问程序 用户类不变classUser privateint id publicintID get return id set id value privatestring name publicstringName get return name set name value IUser接口 解除与具体数据库访问的耦合 interfaceIUser voidInsert Useruser UserGetUser intid 用于访问SqlServer的User classSqlserverUser IUser publicvoidInsert Useruser Console WriteLine 在Sqlserver中给User表增加一条记录 publicUserGetUser intid Console WriteLine 在Sqlserver中根据ID得到User表一条记录 returnnull 用于访问Access的User classAccessUser IUser publicvoidInsert Useruser Console WriteLine 在Access中给User表增加一条记录 publicUserGetUser intid Console WriteLine 在Access中根据ID得到User表一条记录 returnnull 定义一个创建访问User表对象的工厂接口 interfaceIFactory IUserCreateUser 实例化SqlserverUser classSqlServerFactory IFactory publicIUserCreateUser returnnewSqlserverUser 实例化AccessUser classAccessFactory IFactory publicIUserCreateUser returnnewAccessUser 客户端 staticvoidMain string args Useruser newUser IFactoryfactory newAccessFactory IUseriu factory CreateUser iu Insert user iu GetUser 1 Console Read 若要改成SqlServer数据库 只须改此处 考虑另一个问题 数据库里除了有User表之外 可能还有其他表 比方说Department等 classDepartment privateint id publicintID get return id set id value privatestring deptName publicstringDeptName get return deptName set deptName value 用于客户端访问 解除与具体数据库访问的耦合 interfaceIDepartment voidInsert Departmentdepartment DepartmentGetDepartment intid 用于访问SqlServer的Department classSqlserverDepartment IDepartment publicvoidInsert Departmentdepartment Console WriteLine 在Sqlserver中给Department表增加一条记录 publicDepartmentGetDepartment intid Console WriteLine 在Sqlserver中根据ID得到Department表一条记录 returnnull 用于访问Access的Department classAccessDepartment IDepartment publicvoidInsert Departmentdepartment Console WriteLine 在Access中给Department表增加一条记录 publicDepartmentGetDepartment intid Console WriteLine 在Access中根据ID得到Department表一条记录 returnnull interfaceIFactory IUserCreateUser IDepartmentCreateDepartment 实例化SqlserverUser和SqlserverDepartment classSqlServerFactory IFactory publicIUserCreateUser returnnewSqlserverUser publicIDepartmentCreateDepartment returnnewSqlserverDepartment 实例化AccessUser和AccessDepartment classAccessFactory IFactory publicIUserCreateUser returnnewAccessUser publicIDepartmentCreateDepartment returnnewAccessDepartment 客户端 classProgram staticvoidMain string args Useruser newUser Departmentdept newDepartment IFactoryfactory newSqlServerFactory IFactoryfactory newAccessFactory IUseriu factory CreateUser iu Insert user iu GetUser 1 IDepartmentid factory CreateDepartment id Insert dept id GetDepartment 1 Console Read 以上所使用的就是抽象工厂模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态 定义 提供一个创建一系列相关或相互依赖对象的接口 而无需指定他们具体的类 为了方便引进抽象工厂模式 引进一个新概念 产品族 ProductFamily 所谓产品族 是指位于不同产品等级结构 功能相关联的产品组成的家族 如图 图中一共有四个产品族 分布于三个不同的产品等级结构中 只要指明一个产品所处的产品族以及它所属的等级结构 就可以唯一的确定这个产品 引进抽象工厂模式 所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象 如果用图来描述的话 如下图 AbstractFactory模式的结构 用产品族描述如下 抽象工厂 AbstractFactory 角色 担任这个角色的是工厂方法模式的核心 它是与应用系统商业逻辑无关的 具体工厂 ConcreteFactory 角色 这个角色直接在客户端的调用下创建产品的实例 这个角色含有选择合适的产品对象的逻辑 而这个逻辑是与应用系统的商业逻辑紧密相关的 抽象产品 AbstractProduct 角色 担任这个角色的类是工厂方法模式所创建的对象的父类 或它们共同拥有的接口 具体产品 ConcreteProduct 角色 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例 这是客户端最终需要的东西 其内部一定充满了应用系统的商业逻辑 在什么情形下使用抽象工厂模式 希望一个系统不应当依赖于产品类实例如何被创建 组合和表达的细节时 即希望一个系统只是知道产品的接口 而不关心实现的时候 一个系统有多于一个的产品族 而系统只消费其中某一产品族 AbstractFactory模式和Factory模式的区别 AbstractFactory模式是为创建一组 有多类 相关或依赖的对象提供创建接口 Factory模式是为一类对象提供创建接口 从 开放 封闭 原则谈优缺点 开放 封闭 原则要求系统对扩展开放 对修改封闭 通过扩展达到增强其功能的目的 对于涉及到多个产品族与多个产品等级结构的系统 其功能增加包括两方面 增加产品族 AbstractFactory很好的支持了 开放 封闭 原则 增加新产品的等级结构 需要修改所有的工厂角色 没有很好支持 开放 封闭 原则 分离接口和实现 使得客户端从具体的产品实例中解耦综合起来 抽象工厂模式以一种倾斜的方式支持增加新的产品 它为新产品族的增加提供方便 而不能为新的产品等级结构的增加提供这样的方便 本质 选择产品簇的实现 用简单工厂来改进抽象工厂 去除IFactory SqlserverFactory和AccessFactory三个工厂类 取而代之的是DataAccess类 用一个简单工厂模式来实现 代码结构图 DataAccess类 classDataAccess privatestaticreadonlystringdb Sqlserver privatestaticreadonlystringdb Access publicstaticIUserCreateUser IUserresult null switch db case Sqlserver result newSqlserverUser break case Access result newAccessUser break returnresult publicstaticIDepartmentCreateDepartment IDepartmentresult null switch db case Sqlserver result newSqlserverDepartment break case Access result newAccessDepartment break returnresult 客户端 classProgram staticvoidMain string args Useruser newUser Departmentdept newDepartment IUseriu DataAccess CreateUser iu Insert user iu GetUser 1 IDepartmentid DataAccess CreateDepartment id Insert dept id GetDepartment 1 Console Read 直接得到实际的数据库访问实例 而不存在任何依赖 客户端没有出现任何一个SQLSERVER或Access的字样 达到了解耦的目的 问题 switch问题若要增加Oracle数据库访问 修改量较大增加产品族 需要修改所有switch 没有很好支持 开放 封闭 原则 增加新产品的等级结构 较好的支持了 开放 封闭 原则 用反射 抽象工厂的数据访问程序 依赖注入 DependencyInjection 和控制反转 InversionofControl 是同一个概念 具体含义是 当某个角色需要另一个角色的协助时 在传统的程序设计过程中 通常由调用者来创建被调用者的实例 但在 依赖注入 里 创建被调用者的工作不再由调用者来完成 因此称为控制反转 创建被调用者实例的工作通常由Ioc容器来完成 然后注入调用者 因此也称为依赖注入 用反射来实现依赖注入 UsingSystem ReflectionAssembly Load 程序集名称 CreateInstance 命名空间 类名称 字符串可以用变量来处理 classDataAccess privatestaticreadonlystringAssemblyName 抽象工厂模式 privatestaticreadonlystringdb Sqlserver privatestaticreadonlystringdb Access publicstaticIUserCreateUser stringclassName AssemblyName db User return IUser Assembly Load AssemblyName CreateInstance className publicstaticIDepartmentCreateDepartment stringclassName AssemblyName db Department return IDepartment Assembly Load AssemblyName CreateInstance className 再更改数据库时 还是需要去改程序 采用反射 配置文件实现数据访问程序 App config classDataAccess privatestaticreadonlystringAssemblyName 抽象工厂模式1 privatestaticreadonlystringdb ConfigurationManager AppSettings DB publicstaticIUserCreateUser stringclassName AssemblyName db User return IUser Assembly Load AssemblyName CreateInstance className publicstaticIDepartmentCreateDepartment stringclassName AssemblyName db Department return IDepartment Assembly Load AssemblyName CreateInstance className JAVA中的反射 Java反射是Java被视为动态 或准动态 语言的一个关键性质 这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息Java反射相关的API在包java lang reflect中 JDK1 6 0的reflect包如下图 常用类和接口 Member接口 可以获取有关类成员 域或者方法 后者构造函数的信息 Array类 提供动态地生成和访问JAVA数组的方法Constructor类 提供一个类的构造函数的信息以及访问类的构造函数的接口Field类 提供一个类的域的信息以及访问类的域的接口Method类 提供一个类的方法的信息以及访问类的方法的接口 例子 PackagehelloPublicclassWorld 属性privateStringname 无参构造publicWorld 有参构造publicWorld Stringname this name name setter ge
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市政工程实践运用试题及答案
- 小学数学教学由“1”到多 由多返“1”
- 合作经济与可持续发展试题及答案
- 艺术创作与批评技能测试卷
- 工程经济的创新思维探讨试题及答案
- 网络教育在线教育平台与课程资源开发
- 心理学社会认知专题知识梳理
- 村民合作参与农田养殖项目协议书
- 化学工程与工艺实践应用题
- 干货满满的中级经济师试题和答案
- 上海高一数学教材电子版
- GB 17675-2021汽车转向系基本要求
- 2020年7月辽宁省普通高中学业水平合格性考试生物试卷
- 危大工程巡视检查记录表施工电梯
- 麦当劳标准化管理手册 课件
- “危大工程”验收标识牌
- 人民币的故事(课堂PPT)
- 生产异常及停线管理规范(1)
- 学生英语读写情况调查分析报告(二)
- 河北工业大学本科生体育课程考核管理办法-河北工业大学本科生院
- 病房发生火灾应急预案
评论
0/150
提交评论