美文网首页go学习
go闭包和工厂模式

go闭包和工厂模式

作者: 初级赛亚人 | 来源:发表于2017-09-30 18:41 被阅读78次

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

    先说工厂模式,工厂模式有3种:简单工厂模式;工厂方法模式;抽象工厂模式。 go语言中的闭包已经在上一节golang...

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • 设计模式

    构造函数 混合模式(提取公用,节约内存) 模块模式(利用闭包来访问内部) 工厂模式 单利模式 发布订阅模式 发布订...

  • 2019-03-06 python1

    难点 pythonyield设计模式:工厂模式、单例模式闭包、装饰器进程池pool锁蓝图孤儿进程、僵尸进程 高级编...

  • JS-15day

    1、闭包存循环的索引值 2、包做选项卡 3、单体创建对象 4、封闭函数 5、工厂模式创建对象 6、闭包做私有变量计...

  • Go语言设计模式(2)工厂模式

    Go语言设计模式(2)工厂模式 工厂模式的定义 工厂模式的定义如下: Define an interface fo...

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • golang

    golang中闭包的问题 熟悉go语言的开发者都知道,go的闭包是可以记录状态的。当我想用闭包来实现保存某一str...

  • 2018-12-08

    闭包做私有变量计数器 闭包做选项卡 跳转的源页面 获取地址栏参数 Math 单体创建对象 工厂模式创建对象 构造函...

  • 闭包和高阶函数(节流、分时、惰性加载)

    javaScript设计模式中,许多模式都可以用闭包和高阶函数来实现 闭包 一般理解闭包就是返回一个匿名函数,可以...

网友评论

    本文标题:go闭包和工厂模式

    本文链接:https://www.haomeiwen.com/subject/smfnextx.html