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

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

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段

Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。 orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对acti

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

工厂方法模式和抽象工厂模式的区别

区别  工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类可以创建多个具体产品类的实例。    区别: 工厂方法模式只有一个抽象产品类