失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 对抽象工厂+反射+配置文件的实例理解

对抽象工厂+反射+配置文件的实例理解

时间:2018-11-02 00:40:11

相关推荐

对抽象工厂+反射+配置文件的实例理解

第一遍学习设计模式时,总有飘飘然的感觉.《大话设计模式》这本书虽然读起来挺有趣味,也感觉比其他讲设计模式的书好理解一些。但是真要用在机房收费系统时还是费劲的。米老师讲过:思想要上移,行动要下移。这两点要紧密结合,缺一不可。总在思想层面上绕,比如设计模式中所举的生活中的例子,用在代码中却不是那么容易,所以必须要行动下移,认真实践。而总在代码中绕,不进行总结提炼概括,学习就很局限,所以我们也要不断总结,思想上移。第二遍学习抽象工厂是在机房收费系统中,我想讲讲使用它的过程。

一.为什么要用抽象工厂

以备我们的软件要在不同数据库上运行。现在我们使用的是SQL Sever,而要使用Access或者Oracle等时就需要考虑了。抽象工厂可以使我们灵活地更换到其他数据库上。如何能够灵活结合UML图进行理解。

图中的红色框是IDAL(接口)。我举个生活中的例子接电的插口来理解。同一个插口我们可以插电脑,电视,电冰箱等等。只要插头与插口的规格一致就可以。对于这张包中可以看到整个逻辑从UI到IDAL就结束了,后面的D层和Helper要看具体情况,实现接口的可以使SqlDAL,也可以使AccessDAL。

二.反射和配置文件是起什么作用的。

《大话设计模式》中讲过抽象工厂的优点和缺点。缺点之一就是需求增加时,比如要增加一张表。就要至少更改三个类。IFactory,SqlFactory,AccessFacotry...所以采用了简单工厂来改进抽象工厂,而在简单工厂中的实例化需要通过分支判断语句来判断。这里就引入了反射,反射主要来解决分支判断的问题,使得实例化更加地方便。具体如何灵活需要通过实例讲解。

反射使用格式:Assembly.Load("程序集名称").CreateInstance("命名空间.类名称“)

刚开始感觉很晕,不明白程序集名称应该是什么?命名空间又是指得哪个?反射是用来解决分支判断问题的,使得实例化更加方便。程序集一定是要具体实例化的地方。这里就是指D层,默认情况,程序集名称和命名空间是同样的。这里都是SqlDAL,当然如果是AccessDAL,程序集名称就是指AccessDAL了。说它灵活是指可以使用配置文件指定具体是Sql还是Access。而具体的类名称就要看你实现的是什么功能了。如果是登录,那么就是UserDAL(类名称)

三登录实例应用

我按一条线的顺序给出代码:

B层:

[vb]view plaincopy'''<summary> '''验证用户是否存在 '''</summary> '''<paramname="enUser">用户实体</param> '''<returns>DataTable</returns> '''<remarks></remarks> PublicFunctionExistUser(ByValenUserAsEntity.UsersEntity)AsDataTable DimiuAsIDAL.IUser DimdtAsNewDataTable iu=Factory.DataAccess.CreateUser()'由于是shared定义的函数,这里直接调用,不用实例化。 dt=iu.SelectUser(enUser) Returndt EndFunction 工厂:[vb]view plaincopyPrivateSharedReadOnlydbAsString=ConfigurationManager.AppSettings("DB") PrivateSharedReadOnlyassemblyName=db+"DAL" '''<summary> '''使用反射和配置文件创建相应的接口 '''</summary> '''<returns>IUser接口</returns> '''<remarks></remarks> PublicSharedFunctionCreateUser()AsIDAL.IUser DimclassNameAsString=assemblyName+"."+db+"UserDAL" ReturnCType(Assembly.Load(assemblyName).CreateInstance(className),IDAL.IUser)'调用反射 EndFunction

接口:[vb]view plaincopy'''<summary> '''登录时查询用户是否存在. '''</summary> '''<paramname="enUser">参数为用户实体</param> '''<returns>datatable,将userPassword,level,作为表中的两列返回</returns> '''<remarks></remarks> FunctionSelectUser(ByValenUserAsEntity.UsersEntity)AsDataTable D层的命名空间是SqlDAL,类名称为SqlUserDAL。

配置文件:

[vb]view plaincopy<appSettings> <addkey="DB"value="Sql"/> </appSettings> 四.总结:多实践,多总结。

如果觉得《对抽象工厂+反射+配置文件的实例理解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。