本文目录一览:
工厂模式,简单工厂模式,抽象工厂模式三者有什么区别
工厂模式、简单工厂模式、抽象工厂模式三者的区别:
1、创建对象不同。创建对象时,“工厂模式”使用Factory模式替代使用new创建对象;“简单工厂模式”使用fw模式建立对象;“抽象工厂模式”则使用迭代模式创建对象。
2、定义变量不同。“工厂模式”不用事先定义变量,使用时随时引用便可。“简单工厂模式”,使用参数或者配置文件等事先定义好的变量,然后利用分支判断初始化具体产品类并返回。“抽象工厂模式则”不符合“开发-封闭”原则,每次增加产品,都需要修改类方法。-简单工厂配置文件
3、接口数量不同。“工厂模式”有两至三个接口。“简单工厂模式”只有一个接口。抽象工厂模式理论上具有无限个接口。
扩展资料
编程使用“工厂模式”的优缺点:
1、优点:
方便扩展算法,比如增加一个开根号的功能,我们只要继续继承运算类就行了,同时客户端也就是使用者不知道具体的实现细节,只要给出相关标示符,工厂函数就马上给他创建一个他想要的实体就行了。减少了使用者和功能开发者之间的耦合度。-简单工厂配置文件
2、缺点:
在进行扩展的时候,我们要更改工厂函数里面的那个分支语句Switch,这样便破坏了OCP,而且当有多级结构继承的时候,简单工厂就会因为只能对应平行一层记得继承,不得不使得好多类继承同一个接口,然后得到A*B这么多的工厂实体可能,工厂函数很难维护。-简单工厂配置文件
参考资料来源:百度百科--工厂模式
使用简单工厂模式的优点是什么?
简单工厂模式的优点:
1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;
2、简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
3、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
4、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
扩展资料:
简单工厂模式的缺点:
1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
参考资料来源:搜狗百科-简单工厂模式
抽象工厂模式需求改变时怎么修改代码
抽象工厂模式定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
好处:经常用层数据层,便于更换数据库产品,灵活性强,让具体的创建实例过程和客户端分离。
反射技术:提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对 象,或从现有对象中获取类型。
语法格式:Assembly.load("程序集名称").CreatInstance("命名空间 .类名称")
基础介绍完毕,下面逐步认识实例中的应用:
程序采用三层架构,利用抽象工厂实现了DAL和BLL分离,这是包图:
DAL数据层:
IDAL层和DAL层的关系:
工厂层关系:
代码实现:
BLL层方法:
''' summary
''' 增加用户
''' /summary
''' param name="userInfo"实体类/param
''' returns返回不同的情况/returns
''' remarks不同情况代表不同的数值/remarks
Function AddUserInfo(ByVal userInfo As UserInfo) As Integer
Dim iUser As IDAL.IUser
Dim intAdd As Integer
Dim btnAdd As Boolean
Dim dsSelect As New DataSet
'调用抽象工厂实例化数据表
Dim dataAccess As New DataAccess
iUser = dataAccess.CreateUser
'调用数据接口层的函数 查询是否存在用户
dsSelect = iUser.QueryUser(userInfo)
If Not dsSelect.Tables(0).Rows.Count = 0 Then
intAdd = 0 '用户名已经存在,不能重复注册
Return intAdd
Exit Function
Else
' 用户名不存在,可以添加
btnAdd = iUser.AddUser(userInfo)
If btnAdd = True Then
intAdd = 1 '添加成功
Else
intAdd = 2 '出现故障
End If
Return intAdd
End If
End Function
抽象工厂类代码:
'******类名:DataAccess
'******创建人:Jesse
'******创建时间:2012年5月4日
'******说明:用抽象工厂实现数据接口层,用到反射+配置文件
Option Explicit On
Option Strict On
Imports IDAL
Imports System.Reflection '引入反射
Imports System.Configuration '引入配置文件管理
''' summary
''' 简单工厂优化的抽象工厂方法
''' /summary
''' remarks/remarks
Public Class DataAccess
Private Shared ReadOnly AssemblyName As String = "DAL" '数据程序集名称
Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '读取配置文件
''' summary
''' 实例产生User表
''' /summary
''' returnsUser表/returns
''' remarks/remarks
Public Function CreateUser() As IDAL.IUser
Dim ClassName As String = "DAL" + "." + db + "User" '要实例化的类名
Dim User As IUser '定义接口
User = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IUser) '反射实例化
Return User
End Function
''' summary
''' 实例用户基本信息表
''' /summary
''' returns基本信息表/returns
''' remarks/remarks
Public Function CreateStudentInfo() As IStudentInfo
Dim ClassName As String = "DAL" + "." + db + "StudentInfo"
Dim StudentInfo As IStudentInfo
StudentInfo = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IStudentInfo) '反射实例化-简单工厂配置文件
Return StudentInfo
End Function
''' summary
''' 实例充值表
''' /summary
''' returns充值表/returns
''' remarks/remarks
Public Function CreateRecharge() As IRecharge
Dim ClassName As String = "DAL" + "." + db + "Recharge"
Dim Recharge As IRecharge
Recharge = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IRecharge) '反射实例化
Return Recharge
End Function
''' summary
''' 实例化退卡信息表
''' /summary
''' returns退卡信息表/returns
''' remarks/remarks
Public Function CreateCancelCard() As ICancelCard
Dim ClassName As String = "DAL" + "." + db + "CancelCard"
Dim CancelCard As ICancelCard
CancelCard = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), ICancelCard) '反射实例化-简单工厂配置文件
Return CancelCard
End Function
''' summary
''' 实例化上机记录表
''' /summary
''' returns上机记录表/returns
''' remarks/remarks
Public Function CreateOnlineRcd() As IOnlineRcd
Dim ClassName As String = "DAL" + "." + db + "OnlineRcd"
Dim OnlineRcd As IOnlineRcd
OnlineRcd = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IOnlineRcd) '反射实例化-简单工厂配置文件
Return OnlineRcd
End Function
''' summary
''' 实例化基本数据设定
''' /summary
''' returns基本数据设定/returns
''' remarks/remarks
Public Function CreateBasicData() As IDAL.IBasicData
Dim ClassName As String = "DAL" + "." + db + "BasicData"
Dim BasicData As IBasicData
BasicData = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IBasicData) '反射实例化-简单工厂配置文件
Return BasicData
End Function
''' summary
''' 工作记录表
''' /summary
''' returns工作记录表/returns
''' remarks/remarks
Public Function CreateWorklog() As IDAL.IWorklog
Dim ClassName As String = "DAL" + "." + db + "Worklog"
Dim Worklog As IWorklog
Worklog = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IWorklog) '反射实例化
Return Worklog
End Function
''' summary
''' 日结账单表
''' /summary
''' returns/returns
''' remarks/remarks
Public Function CreateBillOfDay() As IBillOfDay
Dim ClassName As String = "DAL" + "." + db + "BillOfDay"
Dim BillOfDay As IBillOfDay
BillOfDay = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IBillOfDay) '反射实例化-简单工厂配置文件
Return BillOfDay
End Function
End Class
IDAL层IUser:
'******类名:IUser
'******创建人:毕桃杨
'******创建时间:2012年5月4日
'******说明:数据表User的接口类
''' summary
''' User数据表接口
''' /summary
''' remarks/remarks
'''
Public Interface IUser
''' summary
''' 查询用户
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Function SelcetUser(ByVal userInfo As Entity.UserInfo) As DataSet
''' summary
''' 修改密码
''' /summary
''' param name="userInfo"实体类/param
''' returns是否修改成功/returns
''' remarks/remarks
Function ModifyPwd(ByVal userInfo As Entity.UserInfo) As Boolean
''' summary
''' 添加用户
''' /summary
''' param name="userInfo"实体类/param
''' returns是否添加成功/returns
''' remarks/remarks
Function AddUser(ByVal userInfo As Entity.UserInfo) As Boolean
''' summary
''' 删除用户
''' /summary
''' param name="userInfo"实体类/param
''' returns是否删除成功/returns
''' remarks/remarks
Function DeleteUser(ByVal userInfo As Entity.UserInfo) As Boolean
''' summary
''' 根据用户等级查询用户
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Function SelectLevel(ByVal userInfo As Entity.UserInfo) As DataSet
''' summary
''' 只是根据用户名查询用户信息
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Function QueryUser(ByVal userInfo As Entity.UserInfo) As DataSet
End Interface
DAL层IUser实现类:
'******类名:SqlUser
'******创建人:毕桃杨
'******创建时间:2012年5月6日
'****** 说明:数据表SqlUser的操作类
Option Explicit On
Option Strict On
Imports System.Data '引用类库
Imports System.Data.SqlClient
Imports IDAL
Imports Entity
''' summary
''' DAL—User操作类
''' /summary
''' remarks/remarks
Public Class SqlUser
Implements IDAL.IUser '实现I_user接口
''' summary
''' 添加用户
''' /summary
''' param name="userInfo"实体类/param
''' returns返回是否添加用户成功/returns
''' remarks/remarks
Public Function AddUser(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.AddUser-简单工厂配置文件
Dim btn As Boolean = False '是否成功标志
Dim sqlHelper As New SQLHelper() '助手类
Dim strSQL As String 'SQL字符串
Dim i As Integer '受影响的行数
'参数集合
Dim paras As SqlParameter()
paras = New SqlParameter() {New SqlParameter("@userID", userInfo.userID),
New SqlParameter("@u_password", userInfo.u_password),
New SqlParameter("@u_level", userInfo.u_level),
New SqlParameter("@u_operator", userInfo.u_operator)
}
'SQL语句
strSQL = "insert into D_sqlUser (userID,u_password,u_level,u_operator)" _
"values(@userID,@u_password,@u_level,@u_operator)"
'执行带参数的过程
i = sqlHelper.ExecuteNonQuery(strSQL, paras, CommandType.Text)
If i 0 Then
btn = True
End If
Return btn
End Function
''' summary
''' 删除用户
''' /summary
''' param name="userInfo"实体类/param
''' returns是否删除成功/returns
''' remarks/remarks
Public Function DeleteUser(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.DeleteUser-简单工厂配置文件
Dim strSQL As String 'sql字符串
Dim i As Integer '受影响的行数
Dim btn As Boolean = False '是否成功标志
Dim sqlHelper As New SQLHelper 'SQL助手类
Dim strUserId As String '用户名
strUserId = userInfo.userID '获取实体类的用户名
'删除用户sql语句
strSQL = "delete from D_sqlStudentInfo where userID ='" Trim(strUserId) "'"
i = sqlHelper.ExecuteNonQuery(strSQL, CommandType.Text)
If i 0 Then
btn = True '成功
End If
Return btn
End Function
''' summary
''' sql实现查询用户
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Public Function SelcetUser(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.SelcetUser-简单工厂配置文件
Dim strUserID As String '用户名存储
Dim strPWD As String '用户密码存储
Dim queryString As String 'SQL查询语句
Dim sqlHelper As SQLHelper = New SQLHelper()
'从实体类获取用户名和密码
strUserID = userInfo.userID
strPWD = userInfo.u_password
'查询SQL语句
queryString = "SELECT * FROM D_sqlUser WHERE userID ='" Trim(strUserID) "'" "AND u_password ='" strPWD "'"-简单工厂配置文件
Dim dtUser As DataSet
'执行不带参数的查询过程
'dtUser = sqlHelper.Query(queryString)
dtUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dtUser
End Function
''' summary
''' 修改密码
''' /summary
''' param name="userInfo"实体类/param
''' returns返回是否修改成功/returns
''' remarks/remarks
Public Function ModifyPwd(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.ModifyPwd-简单工厂配置文件
Dim btn As Boolean = False '是否修改成功判断
Dim sqlHelper As New SQLHelper()
Dim strSQL As String 'SQL语句
Dim i As Integer '受影响的行数
'参数集合
Dim paras As SqlParameter()
paras = New SqlParameter() {New SqlParameter("@userID", userInfo.userID),
New SqlParameter("@u_password", userInfo.u_password)
}
'SQL查询语句
strSQL = "update D_sqlUser set u_password=@u_password where userid=@userID"
i = sqlHelper.ExecuteNonQuery(strSQL, paras, CommandType.Text) '执行带参数的查询过程
If i 0 Then
btn = True '修改成功
End If
Return btn
End Function
''' summary
''' 根据用户等级查询信息
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Public Function SelectLevel(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.SelectLevel-简单工厂配置文件
Dim strLevel As String '获取用户等级
Dim sqlHelper As New SQLHelper
Dim queryString As String 'SQL语句
Dim dsUser As New DataSet '定义记录集
'从实体类获得等级
strLevel = Trim(userInfo.u_level)
'查询SQL语句
queryString = "SELECT * FROM D_sqlUser WHERE u_level ='" Trim(strLevel) "'"
''执行不带参数的查询过程
dsUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dsUser
End Function
''' summary
''' DAL 查询用户只是根据用户名查询
''' /summary
''' param name="userInfo"实体类/param
''' returns返回记录集/returns
''' remarks/remarks
Public Function QueryUser(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.QueryUser-简单工厂配置文件
Dim strUserID As String '用户名
Dim strPWD As String '密码
Dim sqlHelper As New SQLHelper '助手类
Dim queryString As String 'SQL查询语句
'从实体类获取数据
strUserID = userInfo.userID
strPWD = userInfo.u_password
'SQL查询语句
queryString = "SELECT * FROM D_sqlUser WHERE userID ='" Trim(strUserID) "'"
'执行不带参数的查询过程
Dim dsUser As DataSet
dsUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dsUser
End Function
End Class
总结:BLL层无需知道DAL层,IDAL接口层实现了数据层和逻辑层的分离,用反射更是减少了分支判断带来的耦合。