设计模式学习之抽象工厂模式(实现数据访问层)

   1 什么是抽象工厂模式

抽象工厂模式(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=SUNLIKE\SQLEXPRESS;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的配置文件中的稍作修改,便可完成数据库的更换,而不要更该代码。

缺点:如果项目的需求更换,增添了某张数据表,则需要在相应的DAL增添三个类,IDAL增添一个接口,IDAL的三个实体工厂中增添相应的三个函数,BLL增添一个类,Model增添一个实体,改动比较大。

5 抽象工厂模式实现三层架构之数据访问层源代码

说明,下载该资源收您1个资源分,算是对我的尊重和对我劳动果实的回报吧,谢谢您的下载,也谢谢您的访问,如有疑问,请留言,不胜感激。

下载链接:http://download.csdn.net/source/3490633


 

 

 

你可能感兴趣的:(C#,设计模式)