【设计模式】使用 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设计模式之中的一个.简单工厂模式是由一个工厂对象决定创建出 ...
随机推荐
- Android笔记--图形控制
图形Drawable 形状图形(其定义文件是以shape标签为根节点的XML描述文件,支持四种类型的形状) 具体实现: 在shape标签里面,solid指定填充的颜色,stroke指定边框颜色,cor ...
- 初识Node和内置模块
初识Node与内置模块 概述:了解Node.js,熟悉内置模块:fs模块.path模块.http模块 初识Node.js 浏览器中的JavaScript运行环境 运行环境是指代码正常运行所需的必要环境 ...
- .NET应用系统的国际化-多语言翻译服务
上篇文章我们介绍了 .NET应用系统的国际化-基于Roslyn抽取词条.更新代码 系统国际化改造整体设计思路如下: 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言.界面.模块统一管理多有 ...
- Linux 硬盘存储和文件系统介绍
一:硬盘存储 1.存储类型 根据存储的可以将存储分为内存和外存两类. 内存:又叫做主存储器,计算机中所有程序的运行都是在内存中进行. 外存:又叫做辅助存储器,因为内存容量小且断电会丢失所有数据.所以磁 ...
- 【Visual Leak Detector】在 QT 中使用 VLD(方式三)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用前的准备 2. 在 QT 中使用 VLD 2.1 复制 lib 库及头文件 2.2 在项目 .pro 文件中指明路 ...
- 分享我通过 API 赚钱的思路
写在最前 我们经常看到非常多的 API 推荐,但又经常收藏到收藏夹里吃灰,仿佛收藏了就是用了. 很多时候没有用起来,可能是因为想不到某类 API 可以用来做什么或者能应用在哪里. 下面我将我思考的一些 ...
- Terraform 系列-Terraform 项目的典型文件布局
系列文章 Terraform 系列文章 典型文件布局 - modules/ - services/ - webserver-cluster/ - examples/ - main.tf - outpu ...
- odbe简介
Odbc简介 今天工作中遇到一个问题,缺少某个数据库驱动程序,百度半天才发现原来室odbc原因,所以,就捎带学习了一下odbc, ODBC数据源中文名称:开放数据库互联英文名称:Open Databa ...
- 1.使用cookie简单实现单点登录流程
1.动手 实现了简单使用多系统,单一位置同时登陆,以及注销 主要认证中心流程代码编写在为在sso-login包下的ViewConreoller和LoginController:各系统的用户名显示是写在 ...
- 生成df的几种方法
法一: pd.DataFrame( [ (第一行),(第二行),(第三行)] ) df = pd.DataFrame([('bird', 389.0), ('bird', 24.0), ('mamma ...