讲解三层结构和抽象工厂模式的技巧

大多少教员讲解抽象工厂的设计模式,学员无法理解,因为这个知识正如它的名字“抽象工厂”一样难于理解,导致很多教员反馈回来授课效果不好,那么如何讲解好这个知识点呢,我在实际的授课过程中总结了讲解这个难点的方法和演示技巧,总结出来与大家共享。

     这里我们结合课件,采用案例演示教学法,层层深入,大约需要三次课把这个难点讲解完成。第一次课程讲解简单三层授课技巧,具体思路是先准备好一层,即不采用分层实现的代码,在一层的基础上实现两层,再在两层的基础上实现三层,最后引入Model层。首先给学员演示案例“用户登陆窗体”,对于一层如何实现用户登陆功能,这个代码大家非常熟悉,我不多讲解,如下图所示:

 讲解三层结构和抽象工厂模式的技巧


图一 提取方法

在这个层的代码中提取方法,具体操作是选中代码,右键选择重构下的提取方法,这里注意不要选择用户名和用户密码,这里我们就提取到了有两个参数的方法。我们不能发现选择的代码都是针对数据操作的,为了更好的重复使用这段代码,我们一般把它放到哪里呢,引出数据访问层DAL这里在VS2005中演示代码,填写新的类库,即数据访问层类库(DAL),将刚刚提取的方法从表示层剪切到DAL中。再在表示层添加对DAL层的引用,在按钮的Click事件中调用这个方法,我们就实现了从一层到两层的转变,从而实现了最简单的两层结构。

在实际的开发中,具体项目的业务逻辑往往比较复杂,需要写一些方法实现这些复杂的逻辑,为了重用这些代码,我们把它放到表示层和数据访问层中间,称为业务逻辑层。下面在前面代码的基础上演示三层的实现,首先添加一个新的类库即业务逻辑层BLL,然后在BLL层添加具体的方法,引用DAL层的方法,最后在表示层中首先删除对数据访问层的引用,再添加BLL层的引用,更改按钮的Click的代码为引用BLL层的方法。这样三层结构就实现了。

上面的代码我们实现的判断登陆的用户名称和密码是否正确,是一个查询功能,查询传递两个参数这么实现是可以的,但是我们往往需要对大批量的数据进行添加和修改操作,如用户信息的注册,注册的信息可能有十几项,你如何在层与层直接传递数据呢,显然使用带十几个参数的方法是比较麻烦的,在这里我们使用类的属性来传递,每次传递一个对象,这里我们称之为Model层。具体的实现方法添加新的类库,建立实体类,再依次将需要传递的参数作为属性添加到实体类中。最后添加引用,因为作为数据传递,所以每个层多要引入Model层。

通过三层结构的演示,目的让学员感觉三层结构很简单,激发学习的热情和兴趣,让学员喜欢编程序,乐于编程序,先入门了,体会如何实现分层操作,以后彻底理解了,再深入学习,再体会使用分层的好处。具体的讲解过程如图二所示:

 讲解三层结构和抽象工厂模式的技巧


图二 简单三层的实现

     简单的三层结构学员很好理解,对于抽象工厂的讲解,我们依然是要循循善诱,深入浅出,层层深入的讲解。具体的思路讲解首先让学员明白引入接口的原因,再讲解使用简单工厂的便利,最后讲解使用抽象工厂是锦上添花。

     第二次课程讲解接口的引入和简单工厂,为什么要使用接口呢,现在的软件产品不可能指针对一个数据库,如劳资管理系统,大公司使用SQL Server,小公司可能使用Access就够用了,那么如何让一套程序既可使用SQL Server又可使用Access作为数据库呢,答案是我们在数据访问层使用统一的接口,让访问SQL ServerAccess的类都实现这个接口,然后通过接口调用具体的实现。具体的演示方法是在前面代码的基础上点击DAL层的类,右键选择重构,选择提取接口,这样一个接口就出现了。如下图所示:

 讲解三层结构和抽象工厂模式的技巧

                             图三 提取接口

我们这里为了更加的规范,建立一个接口层的类库IDAL,将这个接口移到这个类库IDAL中。接口建立以后,为了可以使用Access库,我们添加新的数据层AccessDAL,再添加一个AccessUserDAL类并实现现刚刚创建的接口。为了方便演示有一个技巧,你可以复制上面的代码和SqlHelpAccessDAL类库中,然后将这个类库下的“Sql”替换成“OleDb”。这里注意SqlHelp里的代码也要替换成访问Oledb的。最后修改BLL层的调用方式为接口调用,用接口隐示的声明,用类显示的实现调用,对于访问SQLServer数据库具体的代码是:ISqlUserDAL dal = new Demo.DAL.SqlUserDAL();如果需要访问Access库,稍加改动变成访问Access库,具体代码是:ISqlUserDAL dal = new Demo.AccessDAL.AccessUserDAL();

接口就可以实现访问不同的数据库我们为什么采用工厂模式呢,原因有两个,第一是客户提出新需求,自己不改变源码就更换为其他数据库;第二是从开发公司考虑,为了适应不同的数据库,每次需要修改BLL层源代码,再编译程序,发布程序比较麻烦。那么具体实现步骤是创建新的工厂项目类,添加类SimpleFactory,然后在类中实现返回实现产品接口的方法,通过Web.Config读取配置数据,针对不同数据库,返回不同实现接口的对象,最后修改BLL层的调用方式为简单工厂调用,用接口隐示声明,但是实现通过工厂创建,代码如下:private static IUserInfo db = SimpleFactory.CreateDalUserInfoInstance();这样我们就可以通过修改配置文件实现不同数据库的访问,实现了简单工厂的设计模式。

第三次课程讲解抽象工厂的实现,有了简单工厂,为什么还要使用抽象工厂呢,原因是一个大的软件项目中包括很多的模块,不同的模块就要创建不同的接口,那么如何返回很多实现接口的对象呢 ,在简单工厂模式中只能编写多块相似的代码,通过判断数据库的类型返回具体的对象,这样就造成大量的代码冗余,这里采用优化的方法,即抽象公共的部分,通过抽象类调用具体的实现类,可以产生一批有关联的产品,例如通过配置文件读取是Access数据库类型,那么得到是Access的工厂,工厂里的产品都是通过访问Access数据库数据产生的产品。可以说对于简单工厂模式一次只能创建一个对象,而对于抽象工厂模式实现一次创建一系列相互依赖对象的需求。

具体的演示实现步骤是首先通过修改前面的编写的简单工厂simpleFactory类为抽象工厂类,添加相应的抽象方法,通过读取对应的配置文件,返回实现抽象类的工厂;然后创建一个具体工厂类SQLFactory继承这个抽象工厂类,重写抽象方法,只返回具体SQLServer库的实现;最后创建新的Access具体工厂类,添加类AccessFactory,让它也继承抽象工厂类,重写抽象方法。另外不要忘记修改BLL层的调用方式为抽象工厂调用,具体的代码是先得到一个工厂,然后再得到相应产品。具体的代码是:

 private static AbsDALFactory factory = AbsDALFactory.ChooseFactory();

 private static IUserInfo db = factory.CreateDalUserInfoInstance();

这样我们就将数据访问层的内容进行了细化,首先引入接口,再使用简单工厂,然后引入抽象工厂模式,通过演示让学员明白为什么要使用简单工厂和抽象工厂以及如何使用它。具体的讲解思路如下图三所示:

 讲解三层结构和抽象工厂模式的技巧


图四 细化数据访问层

这里我们演示完成后,学员还无法透彻地理解抽象工厂模式,下面共享一个生活案例给大家,通过案例剖析抽象工厂的实现方式,首先看下图图五

 讲解三层结构和抽象工厂模式的技巧


图五:抽象工厂一

客户是什么?这里我们说的客户是指调用者,具体而言如网站的美工设计人员;那么地图是什么呢?指配置文件,快餐点比喻我们的抽象工厂,汉堡和鸡腿比喻抽象产品,客户即调用者只知道这些,具体的哪个快餐店,如何制作什么汉堡,客户并不关心,只要能到最方便的快餐店吃到汉堡,填饱肚子即可。具体的工厂是肯德基和麦当劳,具体产品是KFC的汉堡、KFC鸡腿,他们这一组是相关的,另外一组是McDonald汉堡、McDonald鸡腿,他们两个是相关的,是可以左手拿着McDonald汉堡,右手拿着McDonald鸡腿狼吞虎咽的;我们把相关的产品,称为一系列的产品,你还想吃薯条,稍微扩展一下,加一个薯条的产品,包括抽象薯条和具体的薯条。如下图六所示:蓝色框图中的肯德基的汉堡、鸡腿和薯条是相关的,一系列的,由此可以看出抽象工厂设计模式给客户提供的不再是单一的产品,而是提供一批系列的产品。

 讲解三层结构和抽象工厂模式的技巧


图六:抽象工厂二

通过层层深入的代码演示,再结合生活案例来理解抽象工厂,希望大家能够掌握简单三层到抽象工厂的讲解技巧,在实际的授课中深入浅出、步步为营熟练地进行代码演示,让学员彻底理解并会使用抽象工厂设计模式。


展开阅读全文

没有更多推荐了,返回首页