【设计模式】使用 go 语言实现简单工厂模式
2023/5/16 1:22:10
本文主要是介绍【设计模式】使用 go 语言实现简单工厂模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
最近在看《大话设计模式》,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下。
第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果。
这个需求不难,难就难在类要怎么设计,才能达到可复用、维护性强、可拓展和灵活性高。
运算符可能是加、减、乘、除,未了方便以后可以拓展其它运算符,这里可以声明一个抽象接口,通过简单工厂设计模式返回不通的运算类。
package operate type IOperate interface { GetResult(a int, b int) int }
首先声明一个IOperate
抽象接口表示运算,然后新建Add
、Sub
、Mul
和Div
结构体实现这个运行接口:
package operate type Add struct{} func (o Add) GetResult(a int, b int) int { return a + b } type Sub struct{} func (o Sub) GetResult(a int, b int) int { return a - b } type Mul struct{} func (o Mul) GetResult(a int, b int) int { return a * b } type Div struct{} func (o Div) GetResult(a int, b int) int { if b == 0 { panic("除数不能为0") } return a / b }
然后定义一个工厂,参数为运算符号:
package main // NewOperate 按照操作符号创建操作对象 func NewOperate(o string) operate.IOperate { switch o { case "+": return operate.Add{} case "-": return operate.Sub{} case "*": return operate.Mul{} case "/": return operate.Div{} default: panic("操作符号错误") } }
最后运行:
package main import "fmt" func main() { var a, b int fmt.Println("请输入两个数:") fmt.Scanf("%d %d", &a, &b) fmt.Println("请输入运算符号(+、-、*、/):") var operate string fmt.Scanf("%s", &operate) operateObj := NewOperate(operate) result := operateObj.GetResult(a, b) fmt.Printf("%d %s %d = %d\n", a, operate, b, result) }
要增加不同的运算操作只需要新增实现了抽象运算接口的结构体和修改工厂,因为go
语言的函数也是一种类型,其实上面的代码可以简化,不用每次都新增一个结构体:
type OperateFun func(a, b int) int // GetOperateFunc 按照操作符号创建操作函数,函数式编程 func GetOperateFunc(o string) OperateFun { switch o { case "+": return func(a, b int) int { return a + b } case "-": return func(a, b int) int { return a - b } case "*": return func(a, b int) int { return a * b } case "/": return func(a, b int) int { if b == 0 { panic("除数不能为0") } return a / b } default: panic("操作符号错误") }
main
函数可以这样调用:
var a, b int fmt.Println("请输入两个数:") fmt.Scanf("%d %d", &a, &b) fmt.Println("请输入运算符号(+、-、*、/):") var operate string fmt.Scanf("%s", &operate) operateFun := GetOperateFunc(operate) result = operateFun(a, b) fmt.Printf("%d %s %d = %d\n", a, operate, b, result)
写业务代码还是要多想一下用什么设计模式合适,避免编写的代码后面不好维护和扩展,这需要多练习。
这篇关于【设计模式】使用 go 语言实现简单工厂模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站