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语言使用select{}阻塞main函数介绍
Apr 25 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Golang并发工具Singleflight
May 06 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读取html并截取字符串的简单代码
2009/11/30 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
Python日期时间对象转换为字符串的实例
2018/06/22 Python
Django中的forms组件实例详解
2018/11/08 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
python中class的定义及使用教程
2019/09/18 Python
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
十佳大学生村官事迹
2014/01/09 职场文书
投资协议书范本
2014/04/21 职场文书
班级年度安全计划书
2014/05/01 职场文书
教师年终个人总结
2015/02/11 职场文书
中标通知书
2015/04/17 职场文书
永远是春天观后感
2015/06/12 职场文书
任命书格式模板
2015/09/22 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
详解Python魔法方法之描述符类
2021/05/26 Python
入门学习Go的基本语法
2021/07/07 Golang
浅谈JavaScript作用域
2021/12/06 Javascript
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers