Asp.net的抽象工厂模式

来源:互联网 发布:繁体字翻译简体字软件 编辑:程序博客网 时间:2024/05/07 21:17

为什么要使用工厂模式呢?首先先说一下工厂模式的一个特点吧!

  1. 工厂模式可以将模块解耦,在一定程度上使得维护与修改、包括测试都带来了不少方便;

由于工厂模式有如此强大之处,那么必有它的使用之地。在平常的说法中,工厂模式分为两种:一、简单工厂模式;二、抽象工厂模式。下面一一把这两个说清楚。

  • 简单工厂模式

简单工厂模式,显而易知,它只是使用到工厂,但是没有做其他优化的工作。下面举一个例子来说明:

      假设一个项目只有三层(UI、BLL、DAL),BLL层里面有几个类,如下图:

在这里只说BLL层的工厂,其他的自己按照这思路想想。

那么在BLLFactory.cs中定义了一些获取对象的方法,但是这种方法非常的频繁的读取配置文件,因为每读取一个对象都要读取一次配置文件,并且都要我们亲手的new一个工厂才可以获取其内对象,另外,如果该项目中所用的到数据库的表非常之多的话,那么下面的case就是一个不小的数目了,因此,要用到抽象工厂优化。代码如下:

 public class BLLFactory    {        //1.读取配置文件        string strType = System.Configuration.ConfigurationManager.AppSettings["bllUserType"];        public IBLL.IUser GetIUser()        {            //2.根据 配置文件值,产生不同的 业务类对象,返回            switch (strType)            {                 case "BLLA":                    return new BLL.User();                case "BLLB":                    return new BLLB.User();                default :                    return null;            }        }        public IBLL.IDog GetIDog()        {            switch (strType)            {                 case "BLLA":                    return new BLL.Dog();                case "BLLB":                    return new BLLB.Dog();            }            return null;        }    }

2、抽象工厂模式

抽象工厂模式可以在一定程度上将代码解耦,并且也解决了简单工厂模式所遇到的问题。

我们在以上的BLL工厂类库中定义多了一个抽象工厂,这个抽象工厂是让子工厂继承,而且读取配置文件的工作就交给这个抽象工厂进行处理,同时,在抽象工厂中取对象时非常的方便,因为每次都是取出一个子工厂,而这个子工厂包含了所有的所需对象。抽象工厂代码如下:

public abstract class AbsBLLFactory    {        /// <summary>        /// 根据配置文件 返回 不同的 实体业务工厂        /// </summary>        /// <returns></returns>        public static AbsBLLFactory GetFactory()        {            string strType = System.Configuration.ConfigurationManager.AppSettings["factoryType"];            switch (strType)            {                 case "A":                    return new BLLFactoryA();                case "B":                    return new BLLFactoryB();                default: return null;            }        }        //定义 工厂方法,等待不同的实体 工厂实现        public abstract IBLL.IUser GetIUser();        public abstract IBLL.IDog GetIDog();    }

最后,在UI层调用BLL层相应的工厂时,代码就是那么抽象,快捷。维护时也不需要改,而只需要改以下读取配置文件的那个名字就行 。UI层调用代码:

 //创建工厂对象            BLLFactory.AbsBLLFactory bllFac = BLLFactory.AbsBLLFactory.GetFactory();            //1.创建业务层 用户操作接口 对象            IBLL.IUser iuser = bllFac.GetIUser();//new BLLA.User();            List<object> list = iuser.GetUsers();            //2.也可以直接 通过工厂 获取 业务层 其它 类的对象,不需要再次 读取配置文件            IBLL.IDog idog = bllFac.GetIDog();


如果维护、修改使用不同的工厂时,可以改抽象工厂这里:

string strType = System.Configuration.ConfigurationManager.AppSettings["factoryType"];

也可以一起改配置文件里的:

 

 <appSettings>    <add key="webpages:Version" value="2.0.0.0" />    <add key="webpages:Enabled" value="false" />    <add key="PreserveLoginUrl" value="true" />    <add key="ClientValidationEnabled" value="true" />    <add key="UnobtrusiveJavaScriptEnabled" value="true" />    <!--用户配置-->    <add key="bllUserType" value="BLLB" />    <!-- BLLB  -->    <add key="factoryType" value="A" />    <!--A,B-->    <add key="dalFacType" value="B" />    <!--A,B-->    <!-- BLLB  -->  </appSettings>



0 0