第一遍学习设计模式时,总有飘飘然的感觉.《大话设计模式》这本书虽然读起来挺有趣味,也感觉比其他讲设计模式的书好理解一些。但是真要用在机房收费系统时还是费劲的。米老师讲过:思想要上移,行动要下移。这两点要紧密结合,缺一不可。总在思想层面上绕,比如设计模式中所举的生活中的例子,用在代码中却不是那么容易,所以必须要行动下移,认真实践。而总在代码中绕,不进行总结提炼概括,学习就很局限,所以我们也要不断总结,思想上移。第二遍学习抽象工厂是在机房收费系统中,我想讲讲使用它的过程。

一.为什么要用抽象工厂

以备我们的软件要在不同数据库上运行。现在我们使用的是SQL Sever,而要使用Access或者Oracle等时就需要考虑了。抽象工厂可以使我们灵活地更换到其他数据库上。如何能够灵活结合UML图进行理解。

图中的红色框是IDAL(接口)。我举个生活中的例子接电的插口来理解。同一个插口我们可以插电脑,电视,电冰箱等等。只要插头与插口的规格一致就可以。对于这张包中可以看到整个逻辑从UI到IDAL就结束了,后面的D层和Helper要看具体情况,实现接口的可以使SqlDAL,也可以使AccessDAL。

二.反射和配置文件是起什么作用的。

《大话设计模式》中讲过抽象工厂的优点和缺点。缺点之一就是需求增加时,比如要增加一张表。就要至少更改三个类。IFactory,SqlFactory,AccessFacotry...所以采用了简单工厂来改进抽象工厂,而在简单工厂中的实例化需要通过分支判断语句来判断。这里就引入了反射,反射主要来解决分支判断的问题,使得实例化更加地方便。具体如何灵活需要通过实例讲解。

反射使用格式:Assembly.Load("程序集名称").CreateInstance("命名空间.类名称“)

刚开始感觉很晕,不明白程序集名称应该是什么?命名空间又是指得哪个?反射是用来解决分支判断问题的,使得实例化更加方便。程序集一定是要具体实例化的地方。这里就是指D层,默认情况,程序集名称和命名空间是同样的。这里都是SqlDAL,当然如果是AccessDAL,程序集名称就是指AccessDAL了。说它灵活是指可以使用配置文件指定具体是Sql还是Access。而具体的类名称就要看你实现的是什么功能了。如果是登录,那么就是UserDAL(类名称)

三登录实例应用

我按一条线的顺序给出代码:

B层:

[vb] view plaincopy
  1. ''' <summary>
  2. ''' 验证用户是否存在
  3. ''' </summary>
  4. ''' <param name="enUser">用户实体</param>
  5. ''' <returns>DataTable</returns>
  6. ''' <remarks></remarks>
  7. Public Function ExistUser(ByVal enUser As Entity.UsersEntity) As DataTable
  8. Dim iu As IDAL.IUser
  9. Dim dt As New DataTable
  10. iu = Factory.DataAccess.CreateUser()    '由于是shared定义的函数,这里直接调用,不用实例化。
  11. dt = iu.SelectUser(enUser)
  12. Return dt
  13. End Function

工厂:

[vb] view plaincopy
  1. Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB")
  2. Private Shared ReadOnly assemblyName = db + "DAL"
  3. ''' <summary>
  4. ''' 使用反射和配置文件创建相应的接口
  5. ''' </summary>
  6. ''' <returns>IUser接口</returns>
  7. ''' <remarks></remarks>
  8. Public Shared Function CreateUser() As IDAL.IUser
  9. Dim className As String = assemblyName + "." + db + "UserDAL"
  10. Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.IUser)   '调用反射
  11. End Function

接口:

[vb] view plaincopy
  1. ''' <summary>
  2. ''' 登录时查询用户是否存在.
  3. ''' </summary>
  4. ''' <param name="enUser">参数为用户实体</param>
  5. ''' <returns>datatable ,将userPassword,level,作为表中的两列返回</returns>
  6. ''' <remarks></remarks>
  7. Function SelectUser(ByVal enUser As Entity.UsersEntity) As DataTable

D层的命名空间是SqlDAL,类名称为SqlUserDAL。

配置文件:

[vb] view plaincopy
  1. <appSettings >
  2. <add key="DB" value="Sql"/>
  3. </appSettings>

四.总结:多实践,多总结。

对抽象工厂+反射+配置文件的实例理解相关推荐

  1. 谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

    <大话设计模式>中第15章中<就不能不换DB吗?>引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序.当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了 ...

  2. 设计模式之抽象工厂(抽象工厂 + 反射 + 配置文件)

    目录 1.抽象工厂的概念 ​2.抽象工厂的结构图 3.抽象工厂设计模式的练习示例 4.抽象工厂设计模式的练习示例结构图 5. 抽象工厂 + 反射 + 配置文件 5.1:什么是java的反射机制? 5. ...

  3. 机房收费系统总结之5——抽象工厂+反射+配置文件

    起初,机房收费系统用纯三层在做,三层结构已把高内聚,低耦合的思想发挥的淋漓尽致.因为一直听说"抽象工厂",也开始尝试去应用,经过了一番尝试,也OK了.其中当然会用到反射和配置文件, ...

  4. 抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

    分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行. 我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层和数据 ...

  5. java xml 反射_java使用dom4j解析xml配置文件实现抽象工厂反射示例

    逻辑描述: 现在我们想在B层和D层加上接口层,并使用工厂.而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了. 配置文件:beans-config.xml.service-cl ...

  6. 抽象工厂+反射=反射工厂

    在我的上一篇文章(疑惑?改良?从简单工厂到工厂方法)中,详细论述了创建模式中简单工厂到工厂方法的演变过程,并试图结合工厂方法的设计以及.net中的反射机制之所长,改良出一种新型的工厂-反射工厂,这当然 ...

  7. java设计抽象英雄类_java抽象工厂设计模式之游戏实例解析(大话java英雄联盟)...

    # 原创作品,转载请注明出处,谢谢!@杨福星 (http://blog.csdn.net/luckystar92/article/details/52176737) *前言: 最近在学习抽象工厂设计模 ...

  8. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

    重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...

  9. 机房收费系统之抽象工厂篇

    机房收费系统vb.net个人版已完成,在此过程中分层的好处在系统的完成过程中得到了很好的体会.第一遍用的是纯三层做的,这几天又在此基础上又重构了登录的demo,加上抽象工厂和配置文件的使用.下面以登录 ...

最新文章

  1. 2020全球Top10 AI专利公司:美国过半,中国仅占两席
  2. ECSTORE 关于FILTER条件所代表的含义
  3. 明晰软件架构与数据结构
  4. 总结一下ASP.NET MVC 网站的部署问题
  5. C#LeetCode刷题之#371-两整数之和(Sum of Two Integers)
  6. MFC开发IM-第二十五篇、往MFC编辑框最后面追加文本
  7. 安卓异常总结---GestureBuilder] Re-installation failed due to different application signatures
  8. signature=cb97f07fbd7b371e6311b0d8707b6398,vue 汉字转拼音(filter)
  9. cpc客户端网络不通
  10. 计算机多媒体中的媒体种类,多媒体计算机中的媒体信息是指什么
  11. 百合网推试爱机器人,人工智能+婚恋的起点?
  12. jieba.lcut()
  13. 2020年裸辞的人,真的待业了一整年吗?
  14. 服务器7379如何用u盘装系统,怎么用u盘装系统 用U盘装系统安装过程步骤
  15. 网页上做笔记--Diigo
  16. 精密仪器及机械类毕业论文文献包含哪些?
  17. 查找文献时找不到全文的解决方法
  18. Android性能分析之---卡顿分析
  19. C/C++中,数组作为函数参数传入
  20. android GoogleMap画导航线路图 路径规划

热门文章

  1. 【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )
  2. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )
  3. 【组合数学】生成函数 ( 移位性质 )
  4. Oracle分析函数FIRST_VALUE、LAST_VALUE
  5. 剑指Offer——合并两个排序的链表
  6. 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)...
  7. VS2013试用期结束后如何激活
  8. 集合类-HashSet去重
  9. mapreduce shuffle过程
  10. mybatis_helloword(1)