APP下载

在数据访问层使用抽象工厂设计模式的C#实现

2009-07-16唐文芳

新媒体研究 2009年8期
关键词:设计模式

唐文芳

[摘要]简单介绍设计模式的概念,探讨属于创建型模式的抽象工厂设计模式的概念及运用场合,最后给出开发三层结构数据库应用系统,数据访问层使用抽象工厂设计模式的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.

猜你喜欢

设计模式
“1+1”作业设计模式的实践探索
新媒体下的广告设计教学改革与创新方法研究
智慧图书馆环境下的融贯式服务设计模式研究
信息化教学模式构建研究
设计模式在软件设计中的运用
一种基于Android混合开发模式的软件架构设计
设计模式对软件可维护性影响的定量研究
定制服装的设计模式分析
基于生产者/消费者设计模式的连续音频信号采集系统
浅析基于问题的教学设计模式