思想上移,行动下移——抽象工厂+反射+配置文件

2024-05-25 14:08

本文主要是介绍思想上移,行动下移——抽象工厂+反射+配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏。虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单。可以说小菜只是帮我们理解了各个设计模式的用途以及优缺点,真正的理解还需要我们自己动手实践。

  为什么要用抽象工厂?

  主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库。引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可以用AccessDAL实现,能够更好地为B层和D层解耦合。

  

  怎样用于抽象工厂呢?

  我们就以机房收费系统用户登录为例,讲解如何具体运用:

  这里我们用的是SQLServer数据库,配置文件如下:

  

<span style="font-family:KaiTi_GB2312;font-size:18px;">  <appSettings><add key ="DB" value="Sqlserver"/><add key="ConnStr" value="server=.;database=JFSF_Recharge;User ID=sa;Password=123456"/></appSettings></span>
    U层负责接收和输出数据信息,通过B层的返回值显示用户是否登陆成功。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.ClickIf IsEmptyText(Me) = True Then '调用遍历函数判断文本框和选择框是否为空Exit SubElseDim thisUser As Entity.LoginModel = New Entity.LoginModel '定义一个实体对象来获得文本框的内容thisUser.user_name = txtUserid.Text.Trim()thisUser.user_pwd = txtPassword.TextDim ub As BLL.Loginbll = New BLL.Loginbll '定义一个B层对象,通过B层返回结果,通知用户信息If ub.IsUser(thisUser) ThenMessageBox.Show("登陆成功,欢迎使用!")Me.Hide()frmmain.Show()ElseMessageBox.Show("登录失败,请重新输入!")Call NotEmptyText(Me)End IfEnd IfEnd Sub</span>

  B层是逻辑处理层,进行逻辑判断和放置功能函数。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Public Function IsUser(ByVal user As Entity.LoginModel) As BooleanDim factory As New Factory.DBFactory'定义一个接口变量Dim IUser As IUserInfo'调用查找用户的工厂方法IUser = factory.FindUserDim table As DataTableDim flag As Booleantable = IUser.QueryUserInfo(user)If table.Rows.Count = 0 Thenflag = FalseElseflag = TrueEnd IfReturn flagEnd Function</span>

  Factory层应用配置文件和反射技术实现灵活更换数据库功能,更换数据库的过程在这里就是一个拼接字符串。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Shared ReadOnly AssemblyName As String = "DAL" '声明程序集的名称Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '读取配置文件Public Function FindUser() As IDAL.IUserInfoDim className As String = AssemblyName + "." + db + "LoginDAL" '定义类名初值为DAL.SqlserverLoginDALDim iuser As IUserInfoiuser = CType(Assembly.Load(AssemblyName).CreateInstance(className), IUserInfo) '使用反射Return iuserEnd Function</span>

  IDAL层中写好我们需要的父类方法,通过DAL层实现。

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Interface IUserInfo'查询用户的接口函数  Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable
End Interface</span>

  D层重写IDAL层的方法,借助于SQLHelper实现对用户名和密码的查询。

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class SqlserverLoginDAL : Implements IUserInfo '实现接口函数'重写接口中查找用户方法Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable Implements IUserInfo.QueryUserInfoDim strSQL As String = "select * from User_info where userName= @username and passWord=@password"Dim Params() As SqlParameter = {New SqlParameter("@username", user.user_name), New SqlParameter("@password", user.user_pwd)}Dim helper As New SqlHelperDim dbuser = helper.GetDataTable(strSQL, CommandType.Text, Params)Return dbuserEnd FunctionEnd Class</span>

  运用抽象工厂,能够大大的降低B层和D层之间的耦合,使我们能够灵活的更换数据库,更好地满足用户的需求。纸上得来终觉浅,得知此事要躬行,理论上的真理还需要实践来验证。

这篇关于思想上移,行动下移——抽象工厂+反射+配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001721

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun