为什么要使用工厂模式呢?首先先说一下工厂模式的一个特点吧!
- 工厂模式可以将模块解耦,在一定程度上使得维护与修改、包括测试都带来了不少方便;
由于工厂模式有如此强大之处,那么必有它的使用之地。在平常的说法中,工厂模式分为两种:一、简单工厂模式;二、抽象工厂模式。下面一一把这两个说清楚。
- 简单工厂模式
简单工厂模式,显而易知,它只是使用到工厂,但是没有做其他优化的工作。下面举一个例子来说明:
假设一个项目只有三层(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>
Asp.net的抽象工厂模式
最新推荐文章于 2019-09-02 22:51:00 发布