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 21 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang二维数组的使用方式
May 28 Golang
Go timer如何调度
Jun 09 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
Go gorilla/sessions库安装使用
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
VOLVO车载收音机
2021/03/02 无线电
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
Python计算三维矢量幅度的方法
2015/06/15 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
如何使用python进行pdf文件分割
2019/11/11 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
文员个人的求职信范文
2013/09/26 职场文书
2014年项目工作总结
2014/11/24 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
酒店辞职书范文
2015/02/26 职场文书
计算机专业自荐信
2015/03/05 职场文书
2015年电教工作总结
2015/05/26 职场文书
2015年全民创业工作总结
2015/07/23 职场文书