.NET重构(一):抽象工厂模式实现登录
导读:一路艰辛,我也走到了重构。在重构之前,师傅让用经典三层(UI、BLL、DAL)敲了登录、用户的增删改查,共五条线。从开始对三层的朦胧,到五条线结束,终于对三层有了逻辑上清晰的理解。然后就画了几天的类图,最后终于踏上了重构的道路。重构的第一步就是实现登录,考虑到换数据库的问题,就结合了设计模式上的抽象工厂模式。接下来,就说说在这个过程中的一些问题。
文章说明:本文不会贴登录实现的具体代码,纯属个人结合登录这条线的实现对于抽象工厂模式的理解,以及实现过程中出现的问题。
一、基础概念
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
好处1:易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
好处2:它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
二、具体使用
1,为什么用?
就以我第一次做的经典三层和第二次用抽象工厂模式对比来说,第一次直接在D层写了用户名和用户密码的查询,如果需要更换数据库,那么,就得修改具体的SQL代码,一条两条很好改,那么很多很多条呢?所以,怎样快速准确的改变数据库访问是一个急需解决的问题。
2,使用过程
A:开始,使用经典三层写的代码,然后去具体的修改数据库访问代码;B:加入了新的代码实现。比如说我在登录方法中,写了两个方法,然后我再具体的去调用。C:也就是设计模式上的使用字符串变量,也就是传说中的给DB赋值。D:采用配置文件+反射实现数据库访问。
我在理解抽象工厂模式的过程中,经历了A—B—C—D这几个过程。一开始我什么都不知道,就知道要那样去写,但不明白为什么或者说哪里还可以再改进。一步一步的,我终于对抽象工厂模式有了更深的理解。
3,注意的地方
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<strong> <span style="color:#ff6666;"><add key="strDB" value="Sqlserver"/>
<add key ="sqlConnect" value ="Data source=.; Database =Charge_HHX; User ID = sa;Password = 123456 "/> </span></strong>
</appSettings>
</configuration>
</span></span>
当将具体的值在这个地方配置好之后,工厂就会去自动的读取数据库,在这里是读取SQLServer,如果是Access,那么只需要将Value值改为相应的即可。
重新添加Access的具体访问,就变成了扩展而不是修改!
4,常见报错
在这个过程中,最常见的就是配置文件中找不到具体路径的问题和接口方法没有实现。
解决方案:1,首先,检查配置文件;然后,检查当前程序集是否正确(在设计模式中,只有一个层,所以在反射中所说的当前程序集和当前命名空间不是很明确,那么在重构中,这个当前,指的是D层。);最后,改变生成路径。将D层的生成输出路径改到U层(原因不清楚,但问题确实解决了)。
2,首先,检查接口定义的方法是不是都已在D层实现;其次,检查接口中定义的方法和具体实现方法的返回类型是否一样。
三、我获得的便利
书上说的,很标准,但我还是不理解抽象工厂的具体好处。那么,我就说一下在使用过程中,我的具体获得的好处。
秉着单一职责原则,我将所有对User表的访问定义了一个访问接口,然后在D层中具体实现。开始没有使用这个模式,我就得具体的去实例化具体的类,用了这个模式后,我只需要定义一个工厂和接口,然后我需要使用的方法,都可以直接在后面被“.”出来。也不知道别人怎么看,反正在我看来,能让我 “.”出来东西,真的省了我很多事。至少我调用方法的时候,不用点开D层去看到底有哪些方法了。
四、个人感受
在这个过程中,我最大的感受是:不要用别人的成功压榨自己本就急躁的心,停下来,静下来,一步一步的去做,慢慢的,就会收获很多。
一开始学完三层,看个视频,做个登录,就吵吵着要重构,结果是弄的一团糟,师傅一问,啥啥不知道。谢谢师傅为我定下的循序渐进的学习方案,让我一步一步的理解。不像之前那样,就知道看了师哥师姐的博客要那么去做,但为什么要去做,怎样去做,哪里可以改进,是什么都不知道,就知道照抄代码。
在学习的过程中,有时候,我们知道所以然就够了,但有些时候,我们还必须知道之所以然,举一反三。至于这有时候和有些时候具体指什么时候,全靠大家各自斟酌。
请大家多多指点,谢谢!
.NET重构(一):抽象工厂模式实现登录的更多相关文章
- C#抽象工厂模式的几种实现方法及比较
C#抽象工厂模式的几种实现方法及比较 本文转自:http://hi.baidu.com/tufeivista/blog/item/2ca9702978dcc6fb99250a81.html 利用设计模 ...
- 抽象工厂模式和autofac的使用总结
抽象工厂模式和依赖注入的使用目的都是降低对象直接依赖耦合关系,应该说依赖注入是抽象工厂模式的一种升华,功能更强大. 说到抽象工厂的模式,一般都要先解释下简单工厂,简单工厂就是将对象的实例化抽取出来形成 ...
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 设计模式 — 抽象工厂模式(Abstract Factory)
工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...
- VB.NET机房收费 & 抽象工厂模式
学习设计模式的时候,提到了一个专门訪问数据库的模式-抽象工厂模式,记得当时举样例理解的时候并未设计到数据库,仅仅是大概了了解了一下,如今对于机房收费系统涉及到了数据库的管理,借此机会好好学习一下.用常 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
随机推荐
- google kickstart 2018 round D A Candies
思路: 对于small数据,由于求和及奇数数量两个限制条件均满足区间单调性,可以直接使用尺取法(滑动窗口法)求解. 对于large数据,奇数数量依然是满足区间单调性的.首先使用尺取法,找到所有满足奇数 ...
- thinkphp分页集成
控制器: $User = M('webcase'); // 实例化 User 对象 $list = $User->order('id desc')->page($_GET['p'].', ...
- 测试ReplicaSets读写分离和故障转移
读写分离实现步骤: 从库能够进行查询就更好了,这样可以分担主库的大量的查询请求. 1) 先向主库中插入一条测试数据 rs1:PRIMARY> db.c1.insert({age:30});db. ...
- bat 批处理测试局域网速度 两端电脑
C:\Users\Administrator>iperf3 iperf3: parameter error - must either be a client (-c) or server (- ...
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- WPF中播放视频音频
首先要在WPF中播放视频和音频,我们就需要用到MediaElement控件,下面我们示例播放音频和视频. 用MediaElement播放音频: 第一步:将你需要播放的音频(mp3)放在你WPF项目的D ...
- Electric Motor Manufacturer - Motor Protection: 5 Questions, 5 Answers
I. Selection principle of motor protectorThe Electric Motor Manufacturer stated that the reasonab ...
- linux虚拟机安装值得注意的几点
1.建立新的虚拟机时选择自定义安装并选择稍后安装操作系统 2.关键安装命令 tar -xzvf VMwareTools-10.0.6-3595377.tar.gz sudo ./wmware-ins ...
- 运用模逆运算(同余方程)来解决Matlab课上的一道思考题
一道Matlab编程题 & 暴力解法 Matlab课上老师出了这样一道题: 一个篮子有K个鸡蛋: 2个2个拿剩1个: 3个3个全部拿完: 4个4个拿剩1: 5个5个拿剩4个: 6个6个拿剩3个 ...
- javaEE(10)_jdbc基本使用
一.JDBC简介 1.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,JDBC(Java Data Base Connectivity,java数据库连接) ...