golang三种设计模式之简单工厂、方法工厂和抽象工厂


Posted in Golang onApril 10, 2022

随笔背景

某一天询问某大牛--贺某人。询问golang为啥没有构造函数。他给我的回复就是,为啥要有构造函数,给爷爷我写清楚点,不要啥都写隐式标识!!把我一顿怼!(注:不用担心,我被怼很有经验。)然后我就亮出了我的王牌我知道你背着你老婆看小姐姐的证据” (注:他老婆也是好朋友,本人善于告状!)。被逼无奈之下,告诉了我别的方法。如图:
golang三种设计模式之简单工厂、方法工厂和抽象工厂

仔细一想:这他妈不是工厂模式,初始化版V1.0吗?

于实抱着学习的态度用golang实现一下简单工厂方法工厂抽象工厂三种设计模式。

1、简单工厂:

第一步:创建一个文章接口,需要实现阅读和写作的功能。

type Article interface {
	ReadArticle() string
	WriteArticle(contents string) string
}

第二步:创建 中文书英文书 两个“类”,并且分别实现两种方法。(注:golang种没有类,只有组合。应贺总强调,特别说明)

type ChineseArticle struct{}
type EnglishArticle struct{}

func (c *ChineseArticle) ReadArticle() string {
	return "这是中文字符"
}
func (c *EnglishArticle) ReadArticle() string {
	return "this's English chars"
}
func (c *ChineseArticle) WriteArticle(contents string) string {
	return "写入了文章"
}
func (c *EnglishArticle) WriteArticle(contents string) string {
	return "wirted words"
}

第三步:使用断言方式分配不同的参数,应该需要使用什么样的方法去实例化具体的类

func SFactory(lan string) (art Article) {
	switch lan {
	case "Chinese":
		art = &ChineseArticle{}
	case "English":
		art = &EnglishArticle{}
	default:
		art = &ChineseArticle{}
	}
	return art
}

第四步:使用

func main() {
	a := SFactory("Chinese")//这样,我实例化中文书还是英文书都可以了
	fmt.Println(a.ReadArticle())
}

总体结构如下图:

golang三种设计模式之简单工厂、方法工厂和抽象工厂

2、方法工厂:

第一步:同上, 来一个文章接口

type Article interface {
	ReadArticle() string
	WriteArticle(contents string) string
}

第二步:来两种书。需要实例化的类。并且实现接口

type ChineseArticle struct{}
type EnglishArticle struct{}
//实现读写接口
func (c *ChineseArticle) ReadArticle() string {
	return "读书了"
}
func (c *EnglishArticle) ReadArticle() string {
	return "reading books"
}
func (c *ChineseArticle) WriteArticle(contents string) string {
	return "写书了"
}
func (c *EnglishArticle) WriteArticle(contents string) string {
	return "wirting books"
}

第三步:创建两个用来创建“类”的“类”,以及其方法

type CreateEnglish struct{}
type CreateChinese struct{}
//方法工厂的核心。
func (cdb *CreateEnglish) CreateArticle() (len *EnglishArticle, err error) {
	len = &EnglishArticle{}
	return len, nil
}
func (cdb *CreateChinese) CreateArticle() (len *ChineseArticle, err error) {
	len = &ChineseArticle{}
	return len, nil
}

第四步:使用

func main() {
	a := &CreateChinese{}
	art, _ := a.CreateArticle()
	fmt.Println(art.WriteArticle("123"))
}

总体结构如下:

golang三种设计模式之简单工厂、方法工厂和抽象工厂

抽象工厂

第一步:创建一个book,然后再创建一个能够创建book的BookCompany接口。

type BookCompany interface {
	Create() Book
}
type Book interface {
	ReadBook() string
	WriteBook() string
}

第二步:创建两book 并且实现它

type EnglishBook struct{}
type ChineseBook struct{}
//实现book的功能
func (c *EnglishBook) ReadBook() string {
	return "reading a english book"
}
func (c *ChineseBook) ReadBook() string {
	return "读中文书"
}
func (c *EnglishBook) WriteBook() string {
	return "i'am writing"
}
func (c *ChineseBook) WriteBook() string {
	return "我在创作中"
}

第三步:创建两个印刷厂

type BeiJinCompany struct{}
type ShanghaiCompany struct{}
//一个印刷场刷英语书,一个刷中文书
func (c *BeiJinCompany) Create() Book {
	return &EnglishBook{}
}
func (c *ShanghaiCompany) Create() Book {
	return &ChineseBook{}
}

第四步:用起来

func main() {
	var f BookCompany
	f = new(BeiJinCompany)
	book := f.Create()
	fmt.Println(book.ReadBook())
}

整体效果如下:
golang三种设计模式之简单工厂、方法工厂和抽象工厂

Golang 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
goland 设置project gopath的操作
May 06 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 #Golang
Go并发4种方法简明讲解
Go归并排序算法的实现方法
Apr 06 #Golang
golang操作rocketmq的示例代码
Apr 06 #Golang
victoriaMetrics库布隆过滤器初始化及使用详解
如何解决goland,idea全局搜索快捷键失效问题
golang为什么要统一错误处理
You might like
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
PDO实现学生管理系统
2020/03/21 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
Puppet的一些技巧
2018/09/17 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python模块smtplib学习
2018/05/22 Python
django框架ModelForm组件用法详解
2019/12/11 Python
Python单链表原理与实现方法详解
2020/02/22 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
恒华伟业笔试面试题
2015/02/26 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
酒店司机岗位职责
2013/12/14 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2014年人事部工作总结
2014/12/03 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang