go闭包和工厂模式

初级赛亚人 · · 795 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:初级赛亚人

查看原文:go闭包和工厂模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

795 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传