首页 > 其他分享 >【设计模式】使用 go 语言实现简单工厂模式

【设计模式】使用 go 语言实现简单工厂模式

时间:2023-05-15 21:13:35浏览次数:41  
标签:case operate return int fmt 工厂 func go 设计模式

最近在看《大话设计模式》,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下。

第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果。

这个需求不难,难就难在类要怎么设计,才能达到可复用、维护性强、可拓展和灵活性高。

运算符可能是加、减、乘、除,未了方便以后可以拓展其它运算符,这里可以声明一个抽象接口,通过简单工厂设计模式返回不通的运算类。

package operate

type IOperate interface {
	GetResult(a int, b int) int
}

首先声明一个IOperate抽象接口表示运算,然后新建AddSubMulDiv结构体实现这个运行接口:

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)

写业务代码还是要多想一下用什么设计模式合适,避免编写的代码后面不好维护和扩展,这需要多练习。

标签:case,operate,return,int,fmt,工厂,func,go,设计模式
From: https://www.cnblogs.com/codecodify/p/17403137.html

相关文章

  • Java设计模式-简单工厂模式
    简介在软件开发过程中,设计模式是一种被广泛应用的实践,它是通过总结、归纳和提炼出软件设计经验,从而使得设计更加优雅、高效。简单工厂模式是设计模式中最基本、最简单的一种模式,它能够有效地封装对象的创建过程,简化代码结构。简单工厂模式又称为静态工厂方法模式,它是通过定义一......
  • hdu:Let's go home(2-SAT)
    ProblemDescription小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。——余光中集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每......
  • QCategoryAxis的应用
    汉字好像是一个区间呢     axisX=QCategoryAxis()    axisX.append("first",0)    axisX.append("0分25秒",25)    axisX.append("0分50秒",50)    axisX.append("1分15秒",75)    axisX.setLabelsColor(QtGui.QColor......
  • Java设计模式-桥接模式
    简介桥接模式(BridgePattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(GangofFour)提出,在《设计模式》一书中有详细的介绍。桥接模式和其他设计模式的区别在于它关注的是如何将抽象和实现分离,从而达到灵......
  • django系列-路由系统
    一、传统路由(path)#urls.pyfromdjango.contribimportadminfromdjango.urlsimportpathfromapps.webimportviewsurlpatterns=[path('home/',views.home),path('news/<int:nid>/edit/',views.news),path('article......
  • Windows平台下的Go版本切换工具-g
    voidint/gg是一个Linux、macOS、Windows下的命令行工具,可以提供一个便捷的多版本go环境的管理和切换。在这里我们介绍一下在windows下的使用,涉及到我们开发所需要用到的几个go项目层环境变量它们分别是GOPATH,GOPROXY,GO111MODULE,需要先在主页->高级系统设置->环境......
  • django系列-起源&MTV设计模式
    一、django起源Django是一个开放源代码的Web应用框架,使用Python语言编写完成。由于Python语言是跨平台的,所以,不论操作系统是Windows、Linux还是macOSX,都可以开发Django应用。Web框架是一套组件,提供通用的设计模式,能够最大程度地降低开发Web站点的难度。Django的设计目标就是使开......
  • Django文件上传
    form-data格式发送form-data格式上传文件数据,文件对象存储在类字典对象request.FILES中#print(request.POST.get('xxx'))#xxx#print(request.POST.get('yyy'))#yyy#print(request.FILES)#<MultiValueDict:{'file':[<InMemoryUploadedFile:640.......
  • ubuntu22.04 ssh连接失败 userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedA
    userauth_pubkey:keytypessh-rsanotinPubkeyAcceptedAlgorithms[preauth]sshd[14785]:error:Receiveddisconnectfromxxxxport45190:3:com.jcraft.jsch.JSchException:Authfail[preauth]OpenSSH从8.7以后版本开始默认不支持ssh-rsa签名的方式,需要手动设置解决......
  • 苍鹰优化算法NGO结合LSTM做时间序列单输入单输出预测模型,要求数据是单列的时间序列数
    苍鹰优化算法NGO结合LSTM做时间序列单输入单输出预测模型,要求数据是单列的时间序列数据,直接替换数据就可以用。程序语言是matlab,需求最低版本为2021及以上。程序可以出真实值和预测值对比图,线性拟合图,可打印多种评价指标。PS:以下效果图为测试数据的效果图,主要目的是为了显示程序......