工厂模式的应用实例

工厂模式的应用实例

2023年6月23日发(作者:)

⼯⼚模式的应⽤实例就拿机房收费系统来说吧。NUMBER ONE单纯的⽤抽象⼯⼚来实现。这样的好处,是从整个系统的全局出发,⽽不单单从原始的D看待,古⼈云:⽗母之爱⼦则为之计深远。这使得系统更容易扩展了。因为这⾥⾯除了SQLHelper都使⽤了实体包,实体包的线就省略了。NUMBER TWO⽤"简单⼯⼚"去改造的抽象⼯⼚。这⾥说的简单⼯⼚只是因为它没有⼯⼚接⼝。⽽事实上因为我们的机房收费系统是⽤对⼀簇产品进⾏创建使⽤,按理说⼀簇产品应该是抽象⼯⼚的。这样的好处是,在D层实现了解耦,和抽象⼯⼚⽐起来,我们要扩展的话,BLL层和IFactory改动较⼤。NUMBER THREE⽤"简单⼯⼚"和抽象⼯⼚结合改造后,再加上配置⽂件。与NUMBER ONE不同的是去掉⼀条线。这样⼦的好处是去除了DALFactory与实际功能类DAL的耦合。当然如果找个平衡点的话,我们的最佳选择是⽤NUMBER THREE。代码如下。(⼀下代码均以登录为例。UI省略)NUMBER ONEBLL层。'------------------------------------------------------------------------------ ''Copyright(c)htsreserved. ' 'TheSkyAlwaysSunshine '我的博客地址/xhf55555 '2012年2⽉3⽇ ' 'BLL层之登录。 ' '------------------------------------------------------------------------------ PublicClassBLL_LoginPublicFunctionLogin(_User)AsBoolean _User '确定实例化哪个数据库给Factory,来实现换DB。 ry=verFactory '与具体的数据库访问解除了依赖。 IUser=ser() myUser=r(User) d=dThenReturnTrue Else ReturnFalse EndIf EndFunction EndClassIDAL层。'''

'''⽤户表功能接⼝。 ''' ''' PublicInterfaceIUserFunctionGetUser(_User)_User EndInterfaceDAL层。(以SqlserverUser为例。)PublicClassSqlserverUser:ublicFunctionGetUser(_User)_rDimConnStrAsString="DataSource=192.168.24.169;InitialCatalog=PC_ChargeSys;UserID=sa;Pwd=123456"DimconnAsSqlConnection=NewSqlConnection(ConnStr) 'tionHelpDimsqlAsString="select*fromtb_UserwhereUserID='"&&"'" DimcmdAsSqlCommand=NewSqlCommand(sql,conn)DimreadAsSqlDataReader _User Try () read=eReader ()=("") d=("UserPwd") ReturnmyUser CatchexAsException =d="" ReturnmyUser EndTry EndFunction EndClassIFactory层。''' '''定义操作⼯⼚接⼝。 ''' ''' PublicInterfaceIfactoryFunctionCheckUser() EndInterfaceSqlserverFactory具体操作⼯程类。'------------------------------------------------------------------------------ ''Copyright(c)htsreserved. ' 'TheSkyAlwaysSunshine '我的博客地址/xhf55555 '2012年2⽉3⽇ ' '具体的操作类⼯⼚实现抽象的功能类接⼝。' '------------------------------------------------------------------------------PublicClassSqlserverFactory:ryPublicFunctionCheckUser()ser verUser EndFunctionEndClassAccessFactory(与Sqlserver相似,不再赘余。)User实体类。'User实体类。 PublicClassEN_User DimintUserIDAsInteger'定义⽤户编号变量。 DimstrUserNameAsString'定义⽤户姓名变量。DimstrUserPwdAsString'定义⽤户密码变量名。 DimstrUserActorAsString'定义⽤户⾓⾊变量。 DimvntUserRegDateAsDate'定义⽤户注册⽇期。 DimstrUserFlagAsString'定义⽤户是否合法的标记的变量。 DimstrUserTypeAsString'定义⽤户类型变量。''' '''⽤户编号属性⽅法。 ''' ''' ''' '''PublicPropertyUserID()AsInteger Get ReturnintUserID EndGet Set(ByValvalueAsInteger) intUserID=value EndSetEndProperty ''' '''定义⽤户名属性⽅法。 ''' ''' ''' '''PublicPropertyUserName()AsString Get ReturnstrUserName EndGet Set(ByValvalueAsString) strUserName=value EndSetEndProperty ''' '''定义⽤户密码属性⽅法。 ''' ''' ''' ''' PublicPropertyUserPwd()AsString Get ReturnstrUserPwd EndGet Set(ByValvalueAsString) strUserPwd=valueEndSet EndProperty ''' '''定义⽤户⾓⾊属性⽅法。 ''' ''' ''' ''' PublicPropertyUserActor()AsString Get ReturnstrUserActor EndGet Set(ByValvalueAsString)strUserActor=value EndSet EndProperty ''' '''定义注册⽇期变量。 ''' ''' ''' ''' PublicPropertyUserRegDateAsDate Get ReturnvntUserRegDate EndGetSet(ByValvalueAsDate) vntUserRegDate=value EndSet EndProperty ''' '''定义⽤户是否合法的标记。(看是否是已经注销) ''' ''' ''' ''' PublicPropertyUserFlagAsString GetReturnstrUserFlag EndGet Set(ByValvalueAsString) strUserFlag=value EndSet EndProperty ''' '''定义⽤户类型变量(是固定⽤户还是临时⽤户) ''' ''' ''' '''PublicPropertyUserTyep()AsString Get ReturnstrUserType EndGet Set(ByValvalueAsString) strUserType=value EndSetEndProperty EndClass我们再看NUMBER TWO ⽤简单⼯⼚改造的抽象⼯⼚。我们是去掉了IFactory⼯⼚接⼝和他⼿下的具体⼯⼚操作类,⽽⽤⼀个DALFactory代替解决。这样把对功能类的判断放到了DALFactory⾥通过SelectCase来进⾏判断⽽不是通过实例化来判断了。UI、IUser、AccessUser、SqlserverUser是不变的。所以在以上基础上改变 ,代码如下。BLL层代码。''' ''' ⽤户登录业务逻辑。 ''' ''' Public Class BLL_Login Public FunctionLogin(ByVal User As _User) As Boolean Dim myUser As New _User '通过具体的操作⼯⼚实现要判断使⽤哪个数据库。 Dim Dalfactory As New ry Dim IUser As '与具体的数据库访问解除了依赖。 IUser =UserInfo() myUser = r(User) If d = d Then Return True ElseReturn False End If End Function End ClassDALFactory层。Imports IDAL ''' ''' 操作⼯⼚类。 ''' ''' Public Class DFactory 'Dim DataBase AsString = "Access" Dim DataBase As String = "Sql" Function CreateUserInfo() As Dim db As IUser Select CaseDataBase Case "Sql" db = New verUser 'Case "Access" ' db = New User End Select Return db EndFunctionNUMBER THREE我们是改变了操作⼯⼚case⽽⽤反射的⽅法,和case说拜拜。我们⽤case判断太过于发死,把字符串写死在了DALFactory中,我们对功能类的使⽤,不是功能类本⾝去决定⾃⼰。我们要⾃⼰决定⾃⼰的⼈⽣⼤事,所以⽤反射就可以了。这样解除了分⽀判断的耦合。DALFactory代码。Imports IDAL Imports tion ''' ''' 操作⼯⼚类。 ''' ''' Public ClassDFactory 'Dim DataBase As String = "Access" 'Dim DataBase As String = "Sql" Dim strDB As String =tings("DBString") Function CreateUserInfo() As ReturnCType(("DAL").CreateInstance("verUser" & strDB), ) End Function End Class具体的功能类SqlserverUser,只是改了⼀句话。Public Class SqlserverUser : Implements Public Function GetUser(ByVal User As _User) _User Implements r 'Dim ConnStr As String = "Data Source=192.168.24.169;InitialCatalog=PC_ChargeSys;User ID=sa;Pwd=123456" Dim ConnStr As String =tings("ConnStr") Dim conn As SqlConnection = NewSqlConnection(ConnStr) 'Dim connection As New tionHelp 't() Dim sql As String ="select * from tb_User where UserID='" & & "'" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dimread As SqlDataReader Dim myUser As New _User Try () read = eReader () = ("") d = ("UserPwd") Return myUser Catch ex As = 0 d = "" Return myUser End Try End Function End Class综上,我们把简单⼯⼚、⼯⼚⽅法、和抽象⼯⼚三个模式在实际应⽤中进⾏了⽐较。我们的最佳组合是简单⼯⼚改造的抽象⼯⼚加上配置⽂件,耦合度和系统的开闭(对扩展开放、对修改封闭)、系统的可维护和灵活性尽在我们的三个包图中。笔者(me)认为,我们的设计模式就像数学公式,灵活运⽤就好。我们在开发⼀个系统的时候思考问题不要从上向下的思考⽅式,我们要从下向上,不是因为解耦⽽解耦,⽽是我们从系统长远的⾓度出发,使得我们在系统在不断的重构中发现问题,才去不断的思考,进⼀步的抽象,使得系统更加完美。没有完美的系统,只有完美的过程。问题多多,欢迎您前来指教!

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687517615a16365.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信