导读:一路艰辛,我也走到了重构。在重构之前,师傅让用经典三层(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重构(一):抽象工厂模式实现登录的更多相关文章

  1. C#抽象工厂模式的几种实现方法及比较

    C#抽象工厂模式的几种实现方法及比较 本文转自:http://hi.baidu.com/tufeivista/blog/item/2ca9702978dcc6fb99250a81.html 利用设计模 ...

  2. 抽象工厂模式和autofac的使用总结

    抽象工厂模式和依赖注入的使用目的都是降低对象直接依赖耦合关系,应该说依赖注入是抽象工厂模式的一种升华,功能更强大. 说到抽象工厂的模式,一般都要先解释下简单工厂,简单工厂就是将对象的实例化抽取出来形成 ...

  3. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  4. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  5. 设计模式 — 抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

  6. VB.NET机房收费 &amp; 抽象工厂模式

    学习设计模式的时候,提到了一个专门訪问数据库的模式-抽象工厂模式,记得当时举样例理解的时候并未设计到数据库,仅仅是大概了了解了一下,如今对于机房收费系统涉及到了数据库的管理,借此机会好好学习一下.用常 ...

  7. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  8. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  9. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

随机推荐

  1. Spring相关BUG

    今天从云开发平台上生成的代码报Spring相关的错误. 我找到第一处错误,整理如下: org.springframework.beans.factory.BeanCreationException: ...

  2. 【转】阐述Handler的实现原理

    面试题:阐述Handler的实现原理 2016年07月18日 21:01:35 阅读数:7574 处理过程: 从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send… ...

  3. IT人怎样防止过劳死?如何成为时间的主人?

    投行的朋友还没走几天,搜狐的一位同胞又去了.又是过劳死!    每当读到这类新闻,IT人无不反镜自照,顾影自怜.无法拼爹拼钱的我们,似乎只有拼命了.生活好惨淡啊!    有人说:年轻人,悠着点儿!立刻 ...

  4. Handler消息机制的一些原理(直接用code讲解)——Android开发

    package com.example.handlertest; import android.os.Bundle; import android.os.Handler; import android ...

  5. Objective-C Loops

    There may be a situation, when you need to execute a block of code several number of times. In gener ...

  6. Notepad++设计Tab制表符为4个空格

    Notepad++中,常常需要将一个Tab制表符转换成4个空格.这种情况大多发生在对空白检查严格的情况下,比如Python程序. 设置 → 首选项 → 制表符设置 → 勾选“ 转换为空格 ”.

  7. mybatis 部署日志

    <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> &l ...

  8. confluent 更换ip地址之后修改数据库

    由于地址搬迁导致ip地址有变动,整个的confluence的服务器的ip的地址更换和对应的数据库地址更换 root@computer-PowerEdge-T30:/opt/atlassian/conf ...

  9. SQLite-表达式

    SQLite -表达式 一个表达式是一个或多个值的组合,运算符和SQL函数,评价一个值. SQL表达式就像公式和都写在查询语言.您还可以使用为特定的数据集查询数据库. 语法: 考虑到SELECT语句的 ...

  10. sublime text 3中emmet常用技巧

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...