首页 > 代码库 > 一步一步搭建开发框架(二)工厂模式

一步一步搭建开发框架(二)工厂模式

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     }
View Code

 如此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     }
View Code
<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"/>-->
View Code
 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     }
View Code