从三层结构到抽象工厂模式的软件设计

本文作者(王善桃),请您在阅读本文时尊重作者版权。

从三层结构到抽象工厂模式的软件设计

摘要:三层结构作为一种更加普适的架构设计理念,具有分散关注、松散耦合、逻辑复用、标准定义优点。工厂方法模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,在数据库连接中有广泛的应用。本文通过一个简单的实例详细介绍三层结构到抽象工厂的软件设计过程。

关键词:三层结构 抽象工厂 设计模式

首先先准备好一层用户登陆窗体的代码,即不采用分层实现的代码,在一层的基础上实现两层,再在两层的基础上实现三层,最后引入Model层。对于一层用户登陆功能,如下图所示:

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

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

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

三层结构可以让开发人员可以只关注整个结构中的其中某一层; 可以很容易的用新的实现来替换原有层次的实现;可以降低层与层之间的依赖;有利于标准化;利于各层逻辑的复用。

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

我们这里为了更加的规范,建立一个接口层的类库IDAL,将这个接口移到这个类库IDAL中。接口建立以后,为了可以使用Access库,我们添加新的数据层AccessDAL,再添加一个AccessUserDAL类并实现现刚刚创建的接口。为了方便你可以复制上面的代码和SqlHelp到AccessDAL类库中,然后将这个类库下的“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();

这样我们就将数据访问层的内容进行了细化,首先引入接口,再使用简单工厂,然后引入抽象工厂模式,具体的思路如下图三所示:

抽象工厂的使用除了对多系列多类别的应用外,还有一点很重要的原则,即它的一系列的产品总是在一起使用的,只有这样才更能体现出抽象工厂的价值。

结语:从三层结构到抽象工厂是一种典型的软件设计思路,他们是一个优秀的实践标准,但它并不是一个通用的东西,只有满足我们需求和变化的设计才是好设计,而那一刻,无论是设计原则,还是设计模式,都融入我们的心中,而变得空旷起来,一个真正优秀的软件设计人员,他们不会去套用每一个模式,他们在心中都会有自己的一套设计策略,这才谓之无刀胜有刀。

参考文献:

[1]华铨平,抽象工厂设计模式在3层结构开发中的应用,大庆石油学院学报第33卷第3期2009年6月.

[2]魏一搏,抽象工厂模式在.net数据访问层中的应用.信息系统工程, 2010年第2期.

[3]王德永,抽象工厂模式在多种数据库访问程序中的应用,机电产品开发与创新.2009年第6期.

作者简介:王善桃(1968-),男,江苏金湖人,东南大学工程硕士,江苏财经职业技术学院讲师,主要研究方向软件开发。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值