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项目中使用init()
Apr 12 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
golang import自定义包方式
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang switch语句的灵活写法介绍
May 06 Golang
入门学习Go的基本语法
Jul 07 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Golang入门之计时器
May 04 Golang
Go中使用gjson来操作JSON数据的实现
Aug 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之Smarty入门
2007/01/04 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
如何实现JS函数的重载
2006/09/22 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
python中update的基本使用方法详解
2019/07/17 Python
python向图片里添加文字
2019/11/26 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
十佳教师事迹材料
2014/01/11 职场文书
工作保证书范文
2014/04/29 职场文书
篮球比赛口号
2014/06/10 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
库房管理员岗位职责
2015/02/12 职场文书
创卫工作总结2015
2015/04/22 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
vue使用watch监听属性变化
2022/04/30 Vue.js
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers