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 相关文章推荐
go语言map与string的相互转换的实现
Apr 07 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
golang使用map实现去除重复数组
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Go语言测试库testify使用学习
Jul 23 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
php 用sock技术发送邮件的函数
2007/07/21 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
PHP PDO操作总结
2014/11/17 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
javascript中闭包closure的深入讲解
2021/03/03 Javascript
Python中join和split用法实例
2015/04/14 Python
python实现TF-IDF算法解析
2018/01/02 Python
python实现Zabbix-API监控
2018/09/17 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
python3.5的包存放的具体路径
2020/08/16 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
申请任职学生会干部自荐书范文
2014/02/13 职场文书
改革共识倡议书
2014/08/29 职场文书
信用卡催款律师函
2015/05/27 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python