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 25 Golang
golang中的空slice案例
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang: 内建容器的用法
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
golang中的struct操作
Nov 11 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
实现GO语言对数组切片去重
Apr 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 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
无数据库的详细域名查询程序PHP版(4)
2006/10/09 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
如何运行带参数的python脚本
2019/11/15 Python
python清空命令行方式
2020/01/13 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
Tensorflow累加的实现案例
2020/02/05 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
证婚人经典证婚词
2014/01/09 职场文书
高中家长寄语
2014/04/02 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
班主任寄语2016
2015/12/04 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python