在数据访问层使用抽象工厂设计模式的C#实现
2009-07-16唐文芳
唐文芳
[摘要]简单介绍设计模式的概念,探讨属于创建型模式的抽象工厂设计模式的概念及运用场合,最后给出开发三层结构数据库应用系统,数据访问层使用抽象工厂设计模式的C#实例。
[关键词]设计模式 抽象工厂设计模式 三层结构数据库应用系统 C#
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0420030-01
以数据为中心开发的应系统,都涉及到访问数据库问题,还有可能要求能够访问不同的数据库,那在三层结构下数据访问层实现数据访问如何满足客户要求,本文探讨了使用抽象工厂设计模式的C#*实现。
一、设计模式定义、来历
类似的一些问题在开发中经常遇到,经过前人的整理得出的一些好的解决方案,面向对象设计模式就是为了实现面向对象的一些原则的。那么我们可以得到设计模式的定义:设计模式就是重复问题的一些好的解决方案。
设计模式起源于建筑,首先由建筑设计师亚历山大提出的,然后经过前人推广到软件设计行业来。在他的那本著名“模式语言”(A Pattern Language)一书中,他写道:“每个模式都描述着一种在我们的环境中一遍又一遍地出现的问题,并因此描述了对该问题的核心解决方案。以此方式你可以使用该方案上百万次,而从不需要重复作同样的事情。”
软件行业最早出现的设计模式著作是GOF(Gang Of Fours)四人组所著的那本《设计模式-可复用面向对象软件基础》,这本书将设计模式分为三大类:
1.创建型模式:创建型模式是关注对象的创建实例化的。它将对象的创建与对象的实现、描绘相分离。
2.结构型模式:结构型模式关注复杂对象的构建。将小粒度的对象组合成大的对象。
3.行为型模式:行为型模式关注对象的职责以及他们之间如何通信的问题。
抽象工厂设计模式属于对象创建型模式。
二、抽象工厂设计模式的使用场景以及特点
在软件开发中我们经常会碰到一系列相关的对象需要创建,如果按照常规做法我们就要为不同的对象创建编写不同的代码,复用性和可维护性都降低了。而且这些相关对象创建的方式也许不同,那么客户代码创建的时候就要针对不同的对象编码,对象创建的方式还是一个容易改变的地方。基于这样的情况提出了抽象工厂模式,抽象工厂模式为创建一系列相关对象提供了统一的接口,客户只要调用这个接口即可,封装了变化,隔离了变化,让客户代码稳定起来。
何抽象工厂都包含以下四大部分:
1.抽象工厂:为创建对象提供一般接口。
2.具体工厂:抽象工厂的实现。
3.抽象产品:定义了被创建对象的一般接口。
4.具体产品:抽象产品的实现,即实际对象。
抽象工厂设计模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
抽象工厂既可以实现自抽象基类,也可以实现自接口。接口一般是保持基础代码既具有一定的结构,又具有一定的灵活性。但是,有时候我们不希望受到由接口定义的框架的束缚,而转向抽象基类。
三、在数据访问层使用抽象工厂模式
在.NET框架下开发三层结构数据库应用系统,三层指的是:表示层、业务逻辑层、数据访问层。在数据访问层实现对数据库的访问,当应用系统需要访问多个数据库的时候,我们可以采用抽象工厂模式实现具体访问哪个数据库,而不需要修改数据层代码。具体实现的结构如图1示:
从图中我们可以看到,客户只知道有抽象工厂和抽象产品。通过抽象工厂选择创建的实体工厂,我们可以通过修改配置文件的属性值,传递信息选择创建的实体工厂,在实体工厂创建抽象产品的实体产品对象。具体实现部分代码如下:
public abstract class ChoiceFactory// 实现抽象工厂
{public static Demo.AbstractFactory.ChoiceFactory Choicefactory()
{//获取配置文件的属性值
string key = System.Configuration.ConfigurationManager.AppSe
ttings["DAL"];
//判断创建哪个实体工厂
switch(key) {case "SQL":return new SqlFactory();
case "Access":return new AccessFactory();
default: return null; }}
public abstract Demo.IDAl.IUserDAL CreateUserId();//抽象方法}
public class SqlFactory : ChoiceFactory // 实现SQL Server实体工厂
{ public override Demo.IDAl.IUserDAL CreateUserId()
{ return new Demo.DAl.UserDAL();}}
public class AccessFactory : ChoiceFactory //实现 Access实体工厂
{ public override Demo.IDAl.IUserDAL CreateUserId()
{ return new Access.DAL.UserDAL();}}
public interface IUserDAL// 管理员抽象产品
{ bool LoginCheck(string strName, string strPwd);}
public class UserDAL:IUserDAL // SQL Server管理员实体产品
{ public bool LoginCheck(string strName, string strPwd)
{ string strSQL = "usp_ISAdminUser";
SqlParameter[] parm = new SqlParameter[]
{new SqlParameter("@loginId",strName),
new SqlParameter("@loginPwd",strPwd),
new SqlParameter("@return",0)};
parm[2].Direction = ParameterDirection.ReturnValue;
return DBHelper.ExecuteQuery(strSQL, parm); }}
抽象工厂实现采用的是实现自抽象基类,实体工厂继承基类和抽象方法。抽象产品实现采用接口,实体产品类实现抽象产品接口。根据配置属性的值,在抽象工厂里创建的是SQL Server实体工厂,从上面的代码看,那创建的实体产品就是SQL Server管理员实体产品。
四、结束语
采用三层结构开发数据库应用系统,能有效降低建设和维护成本,简化管理,可适应不断的变化和新的业务需求,能有效提高系统安全性等多个优点,在数据库访问层采用抽象工厂设计模式,可以实现方便地访问异构数据库。
参考文献:
[1](美)麦斯科著,颜炯译,C#设计模式,中国电力出版社,2005.7.1.
[2](美)Glenn Johnson,ADO.NET 2.0高级编程,清华大学出版社,2006.5.
[3]阿博泰克,北大青鸟信息技术有限公司编著,在NET框架下开发三层结构数据库应用系统,科学技术文献出版社,2008.1.