【设计模式】使用 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 语言实现简单工厂模式的更多相关文章
- 设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- Javascript设计模式理论与实战:简单工厂模式
通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...
- 设计模式(C#)——02简单工厂模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来.通俗来说,你只关心怎么用,不用关心怎么做 ...
- 设计模式(二)——Java简单工厂模式
简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...
- PYTHON设计模式,创建型之简单工厂模式
这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...
- PHP设计模式(一):简单工厂模式
- 设计模式之简单工厂模式(Simply Factory)摘录
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式.但不属于23种GOF设计模式之中的一个.简单工厂模式是由一个工厂对象决定创建出 ...
随机推荐
- Spring注解和一些类
Spring基础相关 声明Bean,类注解 @Component@Service@Repository IOC,自动注入,属性注解 @AutoWired @Resource @Inject 其他 @I ...
- Caused by: java.lang.NoSuchMethodError
ERROR [localhost-startStop-1] - Context initialization failedorg.springframework.beans.factory.BeanD ...
- Jetson Xavier NX 试玩 (一)
Jetson Xavier NX 试玩 (一) 环境搭建 0 前言 NVIDIA家的Jetson系列是业内嵌入式边缘计算机的代表作,体积小,功能强是其最主要的优点. 学院入手了一款Jeston Xav ...
- 【RSocket】使用 RSocket(三)——服务端主动调用客户端方法
1. 编写客户端接收请求的逻辑 我们可以在初始化 Rsocket 实例的时候指定客户端可以被调用的方法,使用 acceptor() 指定可被调用的方法和方法使用的通信模型类型: 通信类型为 Reque ...
- RMQ总结
题目描述 给定N个数的序列和M次询问,每次询问给定左右端点区间中的最大值 输入样例: 6 (N) 34 1 8 123 3 2 4 (M) 1 2 1 5 3 4 2 3 输出样例: 34 123 1 ...
- 聊天小精灵ChatGPT,好与不好大揭秘!
一.引言 在一个遥远的地球上,有一个名为ChatGPT的魔法盒子,它能够用智慧回答你的问题,解决你的困扰.它是一个聪明的家伙,但和任何家伙一样,有优点也有缺点.现在就让我们一起来探索这个神秘的魔法盒子 ...
- JetBrains 2022全家桶-激活
## JetBrains 全家桶 激活教程 https://tech.souyunku.com/?page_id=50199
- css中所有的选择器(包括比较少见的选择器)
jQuery.CSS常用选择器 符号 描述 示例 说明 紧接无符号 相当于"并且"关系 input.k-textbox{ ...} 选出input并且包含k-textbox类的 ...
- 使用 SK 示例 探索 GitHub 存储库 中的机器人
微软 3月22日 一篇文章"Semantic-kernel 嵌入和记忆:使用聊天UI探索GitHub Repos"[1] ,文章中进行了展示了嵌入,该文章解释了他们如何帮助开发人员 ...
- [MySQL]SQL条件语句
IF语句:IF(expr1, trueResultExpr, falseResultExpr) 若expr1 == TRUE, 则:返回值为 trueResultExpr: 若expr1 == FAL ...