抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们的具体类。结构图如下:

? 分析一下抽象工厂模式,1提供一系列相互依赖对象的创建工作 2 封装对象常规的创建方法 3 提供统一调用数据访问的方式 4 避免调用数据访问方法和具体创建工作。针对上图进行详细分析:
AbstractProductA 和AbstractProductB是两个抽象产品,之所以抽象,是因为他们都有可能有两种不同的实现,而ProductA1,ProductA2 和ProductB1 ,ProductB2就是对两个抽象产品的具体分类的实现,比如在访问数据时,ProductA1可以比作为SqlServer 访问某张表,ProductB1 则可为Access访问该表。
AbstractFactory 是一个抽象工厂类或者一个抽象工厂接口,它里面应该包含所有的产品的抽象方法。而ConcreteFactory1和ConcreteFactory2 就是具体工厂,就像SqlserverFactory 和AccessFactory一样。
通常在运行到的时候创建一个ConcreteFactory类的实例,这个具体共创再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,,客户端应使用不同的具体工厂。
2 抽象工厂的职责
通过上述的详细分析,可以的出抽象工厂模式中的各个对象的主要功能,职责
1. 用抽象工厂生产抽象产品
2.用实体工厂生产实体产品
3 .用抽象产品提供实体产品访问接口
4.用实体产品实现自己的功能
3抽象工厂模式实现三层架构之数据访问层
1 搭建项目,如图

2 项目的依赖关系,根据依赖关系,添加引用(如果连引用都不会添加,建议先学习一下基础知识再来学习设计模式)
?


3 实现数据访问接口
3.1定义接口:IAdminService.cs,代码如下:
public interface IAdminService
{
//检测登录用户是否存在
bool CheckAdmin(int id,string pwd);
}
3.2实现接口:将接口的实现分为三种Sql Server 、Access 和Oracle。
仅介绍SqlServer的实现,其他的代码在文章末尾,附上本例源代码的下载地址。
public class AdminService : IAdminService
{
#region IAdminService 成员
private string connstr = @"Data Source=SUNLIKESQLEXPRESS;Initial Catalog=blank;Persist Security Info=True;User ID=sa;Password=sa";
private SqlConnection conn = new SqlConnection();
private void open()
{
if (conn.State == ConnectionState.Closed)
{
conn.ConnectionString = connstr;
conn.Open();
return;
}
if (conn.State == ConnectionState.Open)
{
return;
}
}
public bool CheckAdmin(int id,string pwd)
{
open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from guanli where username = '"+id+"' and password = '"+pwd +"';";
object result = cmd.ExecuteScalar();
if (conn.State == ConnectionState.Open)
conn.Close();
return result != null ? true : false;
}
#endregion
}
4 实现数据访问层对象创建功能
4.1 编码实现:在抽象工厂(AbstractDALFactory)中用抽象方法提供数据访问对象的创建。
public abstract IAdminService CreateAdminService();//抽象工厂提供抽象产品
4.2 选择实体工厂,没用到反射,其实应该用到反射,这里使用简单的开关语句,便于理解,以后会附上反射的代码,请关注
public static AbstractDALFactory ChooseFactory()
{
string dbType = ConfigurationManager.AppSettings["DBType"].ToString();
AbstractDALFactory factory = null;
switch(dbType)
{
case "Sql":
factory = new SqlDALFactory();
break;
case "Access":
factory = new AccessDALFactory();
break;
case "Oracle":
factory = new OracleDALFactory();
break;
}
return factory;
}
5 通过实体工厂实现数据访问对象的创建,这里仅给出sql server的代码,其他代码见文章末尾的源代码下载连接地址,谢谢
public class SqlDALFactory : AbstractDALFactory
{
public override IAdminService CreateAdminService()
{
return new AdminService();
}
}
6 业务逻辑层(BLL)调用数据访问层方法
public class AdminHandle
{
//选择实体工厂
private static AbstractDALFactory factory = AbstractDALFactory.ChooseFactory();
//创建数据访问对象
private static IAdminService adminService = factory.CreateAdminService();
public bool CheckAdmin(Admin admin)
{
return adminService.CheckAdmin(admin.ID,admin.Password);
}
#region 其他方法
#endregion
}
7 用户界面层(UIL)中的测试代码,如下
Admin admin = new Admin(int.Parse(tbName.Text),tbPwd.Text);
bool isOK = false;
AdminHandle adminHandle = new AdminHandle();
isOK = adminHandle.CheckAdmin(admin);
if (isOK)
MessageBox.Show("登录成功");
else
MessageBox.Show("登录失败");
8 介绍一下三层架构的系统构架
?数据访问层:DALFactory,IDAL,DAL三个项目,业务逻辑层:Model 和BLL两个项目,表示层:UIL一个项目。
其中数据访问层的DAL可以访问SqlServer、Access、Oracle 等其他数据库。
4 抽象工厂模式的优缺点
优点:易于交换产品系列,如果更换数据库,只需要在App.config的配置文件中的<add key="DBType" value="Access"/>稍作修改,便可完成数据库的更换,而不要更该代码。
缺点:如果项目的需求更换,增添了某张数据表,则需要在相应的DAL增添三个类,IDAL增添一个接口,IDAL的三个实体工厂中增添相应的三个函数,BLL增添一个类,Model增添一个实体,改动比较大。
5 抽象工厂模式实现三层架构之数据访问层源代码
说明,下载该资源收您1个资源分,算是对我的尊重和对我劳动果实的回报吧,谢谢您的下载,也谢谢您的访问,如有疑问,请留言,不胜感激。
下载链接:http://download.csdn.net/source/3490633