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

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

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

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

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)

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

【设计模式】使用 go 语言实现简单工厂模式的更多相关文章

  1. 设计模式(Java语言)- 简单工厂模式

    简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...

  2. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  3. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  4. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

  5. Javascript设计模式理论与实战:简单工厂模式

    通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...

  6. 设计模式(C#)——02简单工厂模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来.通俗来说,你只关心怎么用,不用关心怎么做 ...

  7. 设计模式(二)——Java简单工厂模式

    简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...

  8. PYTHON设计模式,创建型之简单工厂模式

    这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...

  9. PHP设计模式(一):简单工厂模式

  10. 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式.但不属于23种GOF设计模式之中的一个.简单工厂模式是由一个工厂对象决定创建出 ...

随机推荐

  1. adb 全局

    win10: 我的电脑-右键属性--系统保护--高级--环境变量--选择path--编辑--点击新建 在新建条目下输入 C:\Users\GL\platform-tool--重新打开cmd 测试adb ...

  2. 在CentOS中安装Docker

    概述 Docker是一款使用Golang开发的开源容器引擎,我们可以使用Docker将自己的应用和相关依赖进行打包,实现在不同服务器上进行快速部署,而不需要再更多关注部署环境的差异性.结合kubern ...

  3. wx.BoxSizer布局管理器用法,及其Add()方法参数说明

    wx.BoxSizer 布局管理器是一种常见的布局管理器,它可以在水平或垂直方向上布置子窗口部件.同时,它还可以在水平或垂直方向上包含其他 wx.BoxSizer 来创建复杂的布局. 下面是 wx.B ...

  4. Freemon停止提供免费域名注册了

    前言 freemon是一家国外的域名注册商,提供很多顶级的域名注册,最棒的是它还提供了五个免费的顶级一级域名注册分别有:tk.cf.ml.ga.gq,而且据我所知是不限量注册,最高一年使用期,可以免费 ...

  5. Mysql 备份方案

    一.为什么要备份 [1]容灾恢复:硬件故障.不经意的 Bug 导致数据损坏,或者服务器及其数据由于某些原因不可获取或无法使用等(例如:机房大楼烧毁,恶意的黑客攻击或 Mysql 的 Bug 等).[2 ...

  6. Spring(Bean详解)

    GoF之工厂模式 GoF是指二十三种设计模式 GoF23种设计模式可分为三大类: 创建型(5个):解决对象创建问题. 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型(7个):一些类 ...

  7. 【踩坑系列】发送微信模板消息返回40165 invalid weapp pagepath

    1. 踩坑经历 最近做了个需求,需要往公司微信公众号推送一个模板消息,并且点击该消息需要跳转到公司小程序的某个页面. 1.1 拿到模板id 既然是发送模板消息,第一步就需要登录微信公众号后台新建模板消 ...

  8. 网络计划技术——关键路线法(Python)

    关键路径法是基于进度网络模型的方法,用网络图表示各项活动之间的相互关系,获得在一定工期.成本.资源约束条件下的最优进度安排.关键路径法源于美国杜邦公司对于项目管理控制成本.减少工期的研究.1959年, ...

  9. PyCharm在Linux安装出现报错-Java Runtime (class file version 55.0)

    在Linux桌面下安装PyCharm的时候出现如下报错 root@ubuntu:~# cd pycharm-community-2021.1.1 root@ubuntu:~/pycharm-commu ...

  10. 重新理解RocketMQ Commit Log存储协议

    本文作者:李伟,社区里大家叫小伟,Apache RocketMQ Committer,RocketMQ Python客户端项目Owner ,Apache Doris Contributor,腾讯云Ro ...