一个典型的工厂模式

namespace Bll
{
   public class empBll
    {
        IDAL.empDal itu = DALFactory.emp_Factory.Createusers(); //=new IDAL.empDal()行吗?这样有什么好处?     

        public DataTable GetAll()
        {
            return itu.GetAll();
        }
}

namespace IDAL
{
    public interface empDal
    {
      DataTable GetAll();
     }
}


namespace DALFactory
{
    public class emp_Factory
    {
       static readonly string path=System.Configuration.ConfigurationManager.AppSettings["DAL"];  
        public static IDAL.empDal Createusers()
        {
            string classname = path + ".sql_emp";
            return (IDAL.empDal)Assembly.Load(path).CreateInstance(classname); //怎么转为接口类型?
        }
    }
}


namespace SQLServerDAL
{
    class sql_emp:IDAL.empDal
    {

        DBunit.SQLAccess sql = new DBunit.SQLAccess();
        public System.Data.DataTable GetAll()
        {
            return sql.ExecuteDataSet("select * from tab_emps join tab_roles on tab_emps.roleID=tab_roles.roleID").Tables[0];
        }

这是一个典型的工厂模式。

目的是用来满足“对修改关闭,对扩展开发”的设计原则。
1、 IDAL.empDal itu = DALFactory.emp_Factory.Createusers();//接口是不能实例化的,只能给接口附一个实例,如果有一个类继承了 empDal接口,可以用new 来实例并赋值,但这样就把实现与接口耦合在一起了,不便于日后扩展,如果这句用工厂来创建实例,只需要修改 System.Configuration.ConfigurationManager.AppSettings["DAL"];  对应的xml配置文档的值,就可以将sql替换成oracl,不用重新编译,就可达到扩展目的。

2、return (IDAL.empDal)Assembly.Load(path).CreateInstance(classname); //怎么转为接口类型?
    这个就是一个多态,CreateInstance方法相当与new的作用。在这里实例化了一个类名为classname的类,这个类必须是继承IDAL.empDal接口的。

posted @ 2012-04-01 10:10  欢喜王子  阅读(321)  评论(0编辑  收藏  举报