首页 > 代码库 > 一步一步搭建开发框架(二)工厂模式
一步一步搭建开发框架(二)工厂模式
1,从(一)说起,面对程序中很有地方都用到Dal层的实例,我们想到了,将创建实例写到一个单独的方法中,由这个方法来维护实例的变化,这样,当需要更改实例的时候,我们只需要更改一下这个方法即可,而不必在程序中到处修改!因此便有了简单工厂。
1 namespace PCITC.OA.DalFactory 2 { 3 public class DalFactory 4 { 5 public static IDal.IUserInforDal GetUserInforDal() 6 { 7 return new PCITC.OA.Dal.UserInforDal(); 8 } 9 }10 }11 public class UserInforService12 {13 14 //使用EfDal15 //private UserInforDal userInforDal = new UserInforDal();16 //使用AdoNetDal17 //private PCITC.OA.AdoNetDal.UserInforDal userInforDal = new PCITC.OA.AdoNetDal.UserInforDal();18 private IDal.IUserInforDal userInforDal = PCITC.OA.DalFactory.DalFactory.GetUserInforDal();19 public UserInfor Add(UserInfor userInfor)20 {21 return userInforDal.Add(userInfor);22 }23 }
如此Bll层仅仅依赖简单工厂这个程序集,需要修改实例的时候,只需要更改简单工厂一处即可!而且即使网站发布也可以,编译一下程序集替换,然后重启IIS,便可以搞定!
2,这样框架又完美了一部分,但即使这样,如果我们需要更改实例的话,还是需要更改代码,然后编译替换程序集。我们希望做到一种更完美的境界,面对需求的变化,不需要更改代码,只需要更改一下配置就搞定!因此,抽象工厂诞生了!
通过反射和配置文件,我们可以实现抽象工厂,真正做到面对需求的变化,一行代码都不改!
1 public class DalSimpleFactory 2 { 3 public static IDal.IUserInforDal GetUserInforDal() 4 { 5 //return new PCITC.OA.Dal.UserInforDal(); 6 return GetInstance("PCITC.OA.Dal", "PCITC.OA.Dal." + "UserInforDal") as IDal.IUserInforDal; 7 8 } 9 10 public static object GetInstance(string assemblyName,string typeName)11 {12 return Assembly.Load(assemblyName).CreateInstance(typeName);13 }14 }
<add key="Assembly" value=http://www.mamicode.com/"PCITC.OA.Dal"/> <add key="NameSpace" value=http://www.mamicode.com/"PCITC.OA.Dal"/> <!--<add key="Assembly" value=http://www.mamicode.com/"PCITC.OA.AdoNetDal"/> <add key="NameSpace" value=http://www.mamicode.com/"PCITC.OA.AdoNetDal"/>-->
1 public class DalSimpleFactory 2 { 3 private static string assemblyName = ConfigurationManager.AppSettings["Assembly"].ToString(); 4 private static string spaceName = ConfigurationManager.AppSettings["NameSpace"].ToString(); 5 public static IDal.IUserInforDal GetUserInforDal() 6 { 7 //return new PCITC.OA.Dal.UserInforDal(); 8 return GetInstance(assemblyName, string.Format("{0}.{1}",spaceName,"UserInforDal")) as IDal.IUserInforDal; 9 10 }11 12 public static object GetInstance(string assemblyName,string typeName)13 {14 return Assembly.Load(assemblyName).CreateInstance(typeName);15 }16 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。