go语言抽象工厂设计 go图形化编程

设计模式系列-Builder模式,工厂方法模式和抽象工厂模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

创新互联从2013年创立,是专业互联网技术服务公司,拥有项目网站设计制作、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元张家口做网站,已为上家服务,为张家口各地企业和个人服务,联系电话:18982081108

使用场景:

1.多个部件或零件,都可以装配到一个对象中,但产生的结果又不相同时。

2.当初始化一个对象特别复杂的时候,比如参数多,而且很多参数都有默认值。

它分为抽象建造者(Builder)角色、具体建造者(ConcreteBuilder)角色、导演者(Director)角色、产品(Product)角色四个角色。

抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造。

具体建造者(ConcreteBuilder)角色:要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。

产品(Product)角色:产品便是建造中的复杂对象。

定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。

任何需要生成复杂对象的地方,都可以使用工厂方法模式。用new就能创建的对象不需要使用工厂模式,因为使用工厂模式就要增加一个工厂类,增加了系统复杂度。

关于工厂方法模式的实现

当确定工厂类只有一个的时候,简单工厂模式

工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象。

我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人;

而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。

工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。

这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。

两者的区别有了,那在具体的应用中,我们该如何选择呢?

是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类

抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

通过工厂类,只要知道工厂类是谁,我就能创建出一个需要的对象

注意事项:

在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不是产品等级。

在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。

也就是说横向扩展容易,纵向扩展困难。

抽象类AbstractCreator要增加一个方法createProductC(),然后两个实现类都要修改,想想看,这严重违反了开闭原则。

你熟悉的设计模式有哪些?写出单例模式的实现代码

23个设计模式:

根据目的设计模式可以分为创造模式,结构模式和行为模式,创建模式用于处理对象的创建。结构模式用于处理类或对象的组合。

行为模式用于描述类或对象如何交互以及如何分配职责,创建模式用于处理对象的创建。主要包括以下五种设计模式:

工厂方法模式()

抽象工厂模式(AbstractFactoryPattern)

建造者模式(BuilderPattern)

原型模式(PrototypePattern)

单例模式(SingletonPattern)

结构模式用于处理类或对象的组合,包括以下七个设计模式:

适配器模式(AdapterPattern)

桥接模式(BridgePattern)

组合模式(CompositePattern)

装饰者模式(DecoratorPattern)

外观模式(FacadePattern)

享元模式(FlyweightPattern)

代理模式(ProxyPattern)

行为模式描述类或对象如何交互以及它们如何分配职责。它由以下11种设计模式组成:

责任链模式(Chain的ResponsibilityPattern)

命令模式(CommandPattern)

解释器模式(InterpreterPattern)

迭代器模式(IteratorPattern)

中介者模式(MediatorPattern)

备忘录模式(MementoPattern)

观察者模式(ObserverPattern)

状态模式(StatePattern)

策略模式(StrategyPattern)

模板方法模式(TemplateMethodPattern)

访问者模式(VisitorPattern)

单例模式实现1:

公共类Singleton{

类共享实例对象

私有静态单例;单例=零;

//私有构造函数

私有Singleton(){

系统。出去了。这是单例!!);

//获取单例方法

公共同步静态单例getInstance(){

//确定共享对象是否为空,如何空一个新对象

If(singleton==null){

singleton=newsingleton();

返回单例。

单例模式实现2:

公共类Singleton{

类共享实例对象实例化

PrivatestaticSingletonSingleton=newSingleton();

//私有构造函数

私有Singleton(){

系统:出去了,这是单例!!);

//获取单例方法

公共静态单例getInstance(){

直接返回共享对象

返回单例。

扩展资料:

注意事项:

设计模式主要分三个类型:创建型和行为型。

Singleton:确保一个类只有一个实例,并为其提供一个全局访问点

AbstractFactory:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

FactoryMethod:定义一个用于创建对象的接口,并让子类决定实例化哪个类。工厂方法将类的实例化延迟到子类。

Builder:将复杂对象的构造与其表示分离,使相同的构造过程可以创建不同的表示。

Prototype:指定要使用Prototype实例创建的对象的类型,并复制该原型来创建一个新对象。

Composite:将对象组合成树状结构,以表示整体各部分之间的关系。组合使用户一致地使用单个对象和组合对象。

Facade:为子系统fa中的一组接口提供一致的接口。Ade提供了一个高级接口,使子系统更易于使用。

Proxy:为其他对象提供一个代理,以控制对该对象的访问

Adapter:将一个接口类转换为客户想要的另一个接口类。适配器模式使那些由于接口不兼容而无法一起工作的类一起工作。

Decrator:式比子类化更灵活,可以为对象动态添加一些额外的职责。

Bridge:模式将抽象部分与其实现部分分离,以便它们可以独立地更改。

Flyweight:享元模式

抽象工厂模式需求改变时怎么修改代码

抽象工厂模式定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。

好处:经常用层数据层,便于更换数据库产品,灵活性强,让具体的创建实例过程和客户端分离。

反射技术:提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对 象,或从现有对象中获取类型。

语法格式: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接口层实现了数据层和逻辑层的分离,用反射更是减少了分支判断带来的耦合。

工厂方法模式和抽象工厂模式的区别

工厂方法模式:

抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

GOF《设计模式》写的很清楚,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。


分享文章:go语言抽象工厂设计 go图形化编程
标题链接:http://pwwzsj.com/article/doceioj.html