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语言求任意类型切片的长度操作
Apr 26 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang日志包logger的用法详解
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang入门之计时器
May 04 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
php 数据结构之链表队列
2017/10/17 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
python 正则式使用心得
2009/05/07 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
python监控进程脚本
2018/04/12 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
人力资源管理专业自荐信
2014/06/24 职场文书
建筑安全责任书范本
2014/07/24 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
地方课程教学计划
2015/01/19 职场文书
个人政治思想总结
2015/03/05 职场文书
2015年会计人员工作总结
2015/05/22 职场文书