Asp.net的抽象工厂模式

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

  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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值