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中的空slice案例
Apr 27 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
入门学习Go的基本语法
Jul 07 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
基于Python实现西西成语接龙小助手
Aug 05 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 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
javascript 一些用法小结
2009/09/11 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
python执行使用shell命令方法分享
2017/11/08 Python
Python中常用信号signal类型实例
2018/01/25 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
对Django外键关系的描述
2019/07/26 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
python 魔法函数实例及解析
2019/09/25 Python
深入理解Python 多线程
2020/06/16 Python
浅析Python 责任链设计模式
2020/09/11 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
会计辞职信范文
2014/01/15 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
python中subplot大小的设置步骤
2021/06/28 Python
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技