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 相关文章推荐
Golang 正则匹配效率详解
Apr 25 Golang
Go语言中的UTF-8实现
Apr 26 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Golang 结构体数据集合
Apr 22 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 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
PHP6 mysql连接方式说明
2009/02/09 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
Python中的并发编程实例
2014/07/07 Python
Python实现partial改变方法默认参数
2014/08/18 Python
python显示生日是星期几的方法
2015/05/27 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
留学推荐信怎么写
2014/01/25 职场文书
师德师风个人反思
2014/04/28 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
2016年清明节寄语
2015/12/04 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
php实现自动生成验证码的实例讲解
2021/11/17 PHP