当前位置: 首页 > news >正文

Go 语言 设计模式-工厂模式

在这里插入图片描述

由于 Go 中缺少类和继承等 OOP 特性, 所以无法使用 Go 来实现经典的工厂方法模式。 不过, 我们仍然能实现模式的基础版本, 即简单工厂。

在本例中, 我们将使用工厂结构体来构建多种类型的武器。

首先, 我们来创建一个名为 i­Gun的接口, 其中将定义一支枪所需具备的所有方法。 然后是实现了 iGun 接口的 gun枪支结构体类型。
两种具体的枪支——ak47与 mus­ket火枪 ——两者都嵌入了枪支结构体, 且间接实现了所有的 i­Gun方法。

gun­Fac­to­ry枪支工厂结构体将发挥工厂的作用, 即通过传入参数构建所需类型的枪支。 main.go 则扮演着客户端的角色。 其不会直接与
ak47或 mus­ket进行互动, 而是依靠 gun­Fac­to­ry来创建多种枪支的实例, 仅使用字符参数来控制生产。

iGun.go: 产品接口

package main
type IGun interface {
	setName(name string)
	setPower(power int)
	getName() string
	getPower() int
}

gun.go: 具体产品

package main
type Gun struct {
	name  string
	power int
}
func (g *Gun) setName(name string) {
	g.name = name
}
func (g *Gun) getName() string {
	return g.name
}
func (g *Gun) setPower(power int) {
	g.power = power
}
func (g *Gun) getPower() int {
	return g.power
}

ak47.go: 具体产品

package main
type Ak47 struct {
	Gun
}
func newAk47() IGun {
	return &Ak47{
		Gun: Gun{
			name:  "AK47 gun",
			power: 4,
		},
	}
}

musket.go: 具体产品

package main
type musket struct {
	Gun
}
func newMusket() IGun {
	return &musket{
		Gun: Gun{
			name:  "Musket gun",
			power: 1,
		},
	}
}

gunFactory.go: 工厂

package main
import "fmt"
func getGun(gunType string) (IGun, error) {
	if gunType == "ak47" {
		return newAk47(), nil
	}
	if gunType == "musket" {
		return newMusket(), nil
	}
	return nil, fmt.Errorf("Wrong gun type passed")
}

main.go: 客户端代码

package main
import "fmt"
func main() {
	ak47, _ := getGun("ak47")
	musket, _ := getGun("musket")
	printDetails(ak47)
	printDetails(musket)
}
func printDetails(g IGun) {
	fmt.Printf("Gun: %s", g.getName())
	fmt.Println()
	fmt.Printf("Power: %d", g.getPower())
	fmt.Println()
}

output.txt: 执行结果

Gun: AK47 gun
Power: 4
Gun: Musket gun
Power: 1

资料来源: Go 工厂方法模式讲解和代码示例

相关文章:

  • 塑化行业SRM供应商管理系统:缩短采购周期时间,改善供应商采购管理
  • 【原创】基于SpringBoot的灾情救助系统(疫情援助系统)(SpringBoot毕业设计)
  • EasyExcel 导入导出Excel文件
  • python基础语法二(函数、列表)
  • Shopee店铺提高商品转化的方法,你get到了吗
  • Java筑基32-IO流02-节点流处理流
  • 【ffmpeg】音频采集
  • 【负荷预测】基于蚂蚁优化算法的BP神经网络在负荷预测中的应用研究(Matlab完整代码实现)
  • 前端例程20220913:粒子飘落效果动画背景
  • 狂神的springboot课程员工管理系统
  • 散列表(哈希表)概述
  • Linux命令之sed批量替换字符串
  • 基于企鹅优化算法的机器人轨迹规划(Matlab代码实现)
  • 今年这情况。。真有点想读研了
  • python pandas query用法
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • canvas 高仿 Apple Watch 表盘
  • git 常用命令
  • gulp 教程
  • happypack两次报错的问题
  • IOS评论框不贴底(ios12新bug)
  • JavaScript新鲜事·第5期
  • JAVA并发编程--1.基础概念
  • Joomla 2.x, 3.x useful code cheatsheet
  • React系列之 Redux 架构模式
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring boot下thymeleaf全局静态变量配置
  • swift基础之_对象 实例方法 对象方法。
  • Zsh 开发指南(第十四篇 文件读写)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 实现简单的正则表达式引擎
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 突破自己的技术思维
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 计算机视觉入门
  • (python)数据结构---字典
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第30天)二叉树阶段总结
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (接口封装)
  • (全注解开发)学习Spring-MVC的第三天
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ./configure、make、make install 命令
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net mvc 获取url中controller和action
  • .Net MVC4 上传大文件,并保存表单
  • .NET MVC第三章、三种传值方式
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)