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 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
对Golang中的FORM相关字段理解
May 02 Golang
golang switch语句的灵活写法介绍
May 06 Golang
goland 设置project gopath的操作
May 06 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
Golang 实现WebSockets
Apr 24 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 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许愿墙模块功能分析
2013/06/25 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python+tkinter实现学生管理系统
2019/08/20 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
企业项目策划书
2014/01/11 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
购房意向书
2014/04/01 职场文书
领导班子整改措施
2014/10/24 职场文书
租车协议书
2015/01/27 职场文书
小学感恩主题班会
2015/08/12 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技