先说工厂模式,工厂模式有3种:简单工厂模式;工厂方法模式;抽象工厂模式。
go语言中的闭包已经在上一节golang闭包分析中说过了。
那么这两者有什么必要的联系吗?
假如有这样一个业务场景,需要我们对不同的字符串进行加密。常用的加密方法诸如md5,sha128,sha512等等。
现在我们先看看用简单工厂模式怎么实现
(1)定义一个接口 GetResult(s string)string
(2)定义一些加密方法,且这些加密方法均实现了该接口
(3)定义一个工厂类,用于决定使用哪个加密方法
工程结构如下:
——FactoryPattern
——methoder
——methoder.go
——encode
——md5.go
——sha512.go
——factory
——factory.go
下面show code:
methoder.go
md5.go
sha512.go
factory.go
main.go
这样我们就用工厂模式实现了用不同方法加密字符串的功能。如果以后还要添加不同的加密方法,那么直接在encode包里面添加即可,并且在factory中添加switch分支。
如果我们用闭包能实现这个功能吗?试试就知道了
为了代码更清晰,这里同样对代码进行了如上工程结构样的分包,不同的是原来的factory包现在改为closure包。
接下来主要贴一下closure.go里面的代码,其他地方大似相同。
分析一下这个闭包里面的代码,Encode()接受的参数是一个methoder.Methoder接口类型的参数,第一个return则是返回一个类型为func(s string)string 的函数,第二个return是调用enc的GetResult方法,并将字符串s加密后结果返回给func(s string)string的第二个string(这个string是匿名函数func(s string)string的返回值类型。
测试函数:
比较一下go闭包实现的工厂模式和普通的工厂模式的区别:
(1)修改代码的地方:如果添加新的加密方法,且该方法实现了GetResult接口,go闭包的方式不用再factory中添加分支,而普通方式则需要添加switch分支。
(2)耦合性:普通的工厂模式在使用的地方(即测试类),只需要引入factory的包即可,无需关心encode的包;而go闭包的实现方式则需要在使用的地方引入factory的包和encode的包。
有疑问加站长微信联系(非本文作者)