go闭包和工厂模式

先说工厂模式,工厂模式有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

go闭包和工厂模式_第1张图片

sha512.go

go闭包和工厂模式_第2张图片

factory.go

go闭包和工厂模式_第3张图片

main.go

go闭包和工厂模式_第4张图片

这样我们就用工厂模式实现了用不同方法加密字符串的功能。如果以后还要添加不同的加密方法,那么直接在encode包里面添加即可,并且在factory中添加switch分支。


如果我们用闭包能实现这个功能吗?试试就知道了

为了代码更清晰,这里同样对代码进行了如上工程结构样的分包,不同的是原来的factory包现在改为closure包。

接下来主要贴一下closure.go里面的代码,其他地方大似相同。

go闭包和工厂模式_第5张图片

分析一下这个闭包里面的代码,Encode()接受的参数是一个methoder.Methoder接口类型的参数,第一个return则是返回一个类型为func(s string)string 的函数,第二个return是调用enc的GetResult方法,并将字符串s加密后结果返回给func(s string)string的第二个string(这个string是匿名函数func(s string)string的返回值类型。

测试函数:

go闭包和工厂模式_第6张图片


比较一下go闭包实现的工厂模式和普通的工厂模式的区别:

(1)修改代码的地方:如果添加新的加密方法,且该方法实现了GetResult接口,go闭包的方式不用再factory中添加分支,而普通方式则需要添加switch分支。

(2)耦合性:普通的工厂模式在使用的地方(即测试类),只需要引入factory的包即可,无需关心encode的包;而go闭包的实现方式则需要在使用的地方引入factory的包和encode的包。这里有个可以降低耦合性的方法,就是将这几个文件集合到一个包下,这样在使用的地方只需要导入一个包即可,这样耦合性就和普通的一样了。


可以看出go的闭包很像一个工厂,你需要什么,他就可以给你提供什么,同时这两种方式各有优缺点。

你可能感兴趣的:(go闭包和工厂模式)