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 08 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Golang数据类型和相互转换
Apr 12 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang实现可重入锁的示例代码
May 25 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
php实现读取手机客户端浏览器的类
2015/01/09 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
js的event详解。
2006/09/06 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python实现批量压缩图片
2018/01/25 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
keras得到每层的系数方式
2020/06/15 Python
虚拟机下载python是否需要联网
2020/07/27 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
决心书标准格式
2014/03/11 职场文书
师范生自我鉴定
2014/03/20 职场文书
事假请假条范文
2014/04/11 职场文书
给校长的建议书100字
2014/05/16 职场文书
商铺消防安全责任书
2014/07/29 职场文书
争先创优心得体会
2014/09/12 职场文书
2014年医生工作总结
2014/11/21 职场文书
运动会开幕式致辞
2015/07/29 职场文书
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android