范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

工厂方法演进

  最近review代码,感觉工厂方法使用的不准确,正好以此为例聊一下工厂方法的演进。   实例初始需求
  假设我们有一个需求,需要根据不同的信号做不同的事情,如做饭、吃饭。
  在此需求基础上,我们用Go实现比较简单,使用经典的简单工厂即可:   创建一个interface,包含参数检查、执行动作   创建做饭、吃饭类,实现interface中的两个函数
  因为信号不同行为不同,根据查表法与switch有什么区别?,为后期扩展方便,我们选择switch方式。   需求进化
  后面我们发现需求变了,要增加洗碗、拖地,而且这两个的操作和做饭也很相似。
  这种情况下我们可以选择的方案有:   复用做饭类,在里面通过if判断是洗碗还是拖地   做饭、吃饭、洗碗、拖地完全独立,相互之间没有交集
  我们肯定选择方案2,使用下面两个技巧使代码高内聚、低耦合   使用基类:如洗碗、拖地都需要用水清扫,这些相同操作,在基类中实现,洗碗、拖地类继承基类   提取公因子,将各个类共同的功能放到框架中,如在做之前都吼了一嗓子,"我不想工作"   简单工厂实现
  关于工厂模式,大家可以看一下我的这篇文章Go设计模式(7)-工厂模式。简单工厂方法的UML图如下:
  对于初始需求的代码实现如下所示:   package main import "fmt" /**  * @Author: Jason Pang  * @Description:  */ type Life interface { 	CheckParams() error //参数检查 	Do() error          //执行动作 } type Cook struct { } /**  * @Author: Jason Pang  * @Description: 做饭参数检查  * @receiver c  * @return error  */ func (c *Cook) CheckParams() error { 	fmt.Println("cook 检查参数,食材准备完毕") 	return nil } /**  * @Author: Jason Pang  * @Description: 开始做饭  * @receiver c  * @return error  */ func (c *Cook) Do() error { 	fmt.Println("不想工作") 	fmt.Println("开始做饭") 	return nil } type Eat struct { } /**  * @Author: Jason Pang  * @Description: 吃饭参数检查  * @receiver c  * @return error  */ func (c *Eat) CheckParams() error { 	fmt.Println("eat 检查参数,饭已做好,碗筷放好") 	return nil } /**  * @Author: Jason Pang  * @Description: 开始吃饭  * @receiver c  * @return error  */ func (c *Eat) Do() error { 	fmt.Println("不想工作") 	fmt.Println("开始吃饭") 	return nil } /**  * @Description: 简单工厂  */ type Factory struct { } func (simple *Factory) create(ext string) Life { 	switch ext { 	case "cook": 		return &Cook{} 	case "eat": 		return &Eat{} 	} 	return nil } func main() { 	//简单工厂使用代码 	fmt.Println("------------简单工厂") 	factory := &Factory{} 	life := factory.create("cook") 	if life != nil { 		life.CheckParams() 		life.Do() 	} } 简单工厂演进实现
  需求演变之后,代码实现如下:   package main import "fmt" /**  * @Author: Jason Pang  * @Description:  */ type Life interface { 	CheckParams() error //参数检查 	Do() error          //执行动作 } /**  * @Author: Jason Pang  * @Description: 基类  */ type BaseLife struct { } /**  * @Author: Jason Pang  * @Description: 参数检查  * @receiver c  * @return error  */ func (c *BaseLife) CheckParams() error { 	fmt.Println("通用参数检查") 	return nil } /**  * @Author: Jason Pang  * @Description: 开始做饭  * @receiver c  * @return error  */ func (c *BaseLife) Do() error { 	fmt.Println("用水处理") 	return nil } type Cook struct { } /**  * @Author: Jason Pang  * @Description: 做饭参数检查  * @receiver c  * @return error  */ func (c *Cook) CheckParams() error { 	fmt.Println("cook 检查参数,食材准备完毕") 	return nil } /**  * @Author: Jason Pang  * @Description: 开始做饭  * @receiver c  * @return error  */ func (c *Cook) Do() error { 	fmt.Println("开始做饭") 	return nil } type Eat struct { } /**  * @Author: Jason Pang  * @Description: 吃饭参数检查  * @receiver c  * @return error  */ func (c *Eat) CheckParams() error { 	fmt.Println("eat 检查参数,饭已做好,碗筷放好") 	return nil } /**  * @Author: Jason Pang  * @Description: 开始吃饭  * @receiver c  * @return error  */ func (c *Eat) Do() error { 	fmt.Println("开始吃饭") 	return nil } /**  * @Author: Jason Pang  * @Description: 洗碗  */ type Wash struct { 	BaseLife } type Mop struct { 	BaseLife } func (c *Mop) CheckParams() error { 	fmt.Println("mop 检查参数,拖把是否存在") 	return nil } /**  * @Description: 简单工厂  */ type Factory struct { } func (simple *Factory) create(ext string) Life { 	switch ext { 	case "cook": 		return &Cook{} 	case "eat": 		return &Eat{} 	case "wash": 		return &Wash{} 	case "mop": 		return &Mop{} 	} 	return nil } func EchoBeforeDo() { 	fmt.Println("不想工作") } func main() { 	//简单工厂使用代码 	fmt.Println("------------简单工厂") 	factory := &Factory{} 	life := factory.create("mop") 	if life != nil { 		life.CheckParams() 		EchoBeforeDo() 		life.Do() 	} }
  输出:      myproject go run main.go ------------简单工厂 cook 检查参数,食材准备完毕 不想工作 开始做饭    myproject go run main.go ------------简单工厂 eat 检查参数,饭已做好,碗筷放好 不想工作 开始吃饭    myproject go run main.go ------------简单工厂 通用参数检查 不想工作 用水处理    myproject go run main.go ------------简单工厂 mop 检查参数,拖把是否存在 不想工作 用水处理
  大家可以看到,  这种方案即保证了各个操作之间的独立,又复用了共同代码(通过基类和提取公因子)。   总结
  使用工厂方法,有两个检验标准   具体产品类不应该相互之间关联   产品类里也不应该有相同的代码
  随着对业务的理解,区分出变与不变的内容,不变的内容需要整合到框架中,不应该在各个产品类里。
  产品类只需关注自己的逻辑,按照接口要求处理输入和返回值。这样今后即使有新功能接入,开发者也不需要关心整体框架,上手速度快、出问题的概率低。
  如果有默认的逻辑操作能跑通整个流程,最好有一个基类实现这个逻辑,这样就能最大程度的进行复用。
  开发过程中需要随着业务的变化和自己对业务的理解不断重构代码,这样才能让代码不成为屎山。但很多同学可能不敢重构,怕引起更多问题。其实这就和单元测试、自动化测试等关联起来了,只要质量保障的好,才能更放心的修改。我认为质量保障就是内功了,需要不断的坚持、不松懈,需要团队有很强的执行力,这是很难短时间被学去的,这便是护城河。
  代码位置:https://github.com/shidawuhen/asap/blob/master/controller/design/factory.go   最后
  大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
  我的个人博客为:https://shidawuhen.github.io/
  往期文章回顾:   设计模式   招聘   思考   存储   算法系列   读书笔记   小工具   架构   网络   Go语言

李梦决赛会复出吗?高烧39。4度,昏睡一天仍38度,郑薇正式回应中国女篮赢了,在缺少女篮核心李梦的情况下,女篮球员将无畏金兰发挥到极致,她们每个人将自己的角色做到了极致努力去填补李梦缺阵带来的缺失。韩旭9中7,拿到了19分11篮板,杨力维18分假期留深攻略来咯期待已久的十一假期即将开启。你有假期计划吗?无奈疫情反复,大部分小伙伴可能和本人一样只能留深虽然你无法离深远行,但这需要7天。可以去爬爬山,放心繁琐的工作,好好的亲近一下大自然让你国庆去哪玩?伯温故里,天然文成时光荏苒,岁月如梭。又是一年秋风起,又是一年国庆至。在这个阖家团圆的日子里,你准备去哪玩呢?如果你还没有选好出行目的地,那么我推荐你来伯温故里,天然文成吧。拒绝人从众,这个景美人少欢度国庆节喜迎二十大来源人民网人民日报习近平总书记强调我们必须始终赓续红色血脉,用党的奋斗历程和伟大成就鼓舞斗志指引方向。今年国庆假期,全国多地红色景区在做好疫情防控前提下,举办了丰富多彩的主题活动,送你一张排毒方五积散,风邪寒邪瘀证湿邪痰浊可除也现在,热衷于中医的人是越来越多了。有人曾向远志抱怨,说中医的诊断不如西医的诊断让人一眼就明了自己得的到底是啥病。但大家反过来想想,是不是有些中医的诊断也不如西医的诊断来得那么吓人。黑暗之魂重制版更新了些啥黑暗之魂重制版是一款非常经典的动作角色扮演游戏,是黑暗之魂的重制版和加强版。游戏基于PC版,高清重制版,带来更好的游戏体验。很多玩家一直将黑暗之魂1视为该系列最具代表性的作品,1代专家GTA6泄露对R星也有积极影响很多玩家都认为,此次的GTA6泄露事件不管是对R星,还是对玩家来说都是不利的。这可能会导致跳票,甚至影响游戏质量。但是有行业分析师认为该事件是有些积极影响的。相关行业的专家表示,此防骑团本前装备最效率提升方案应昨天的留言需要,今天做一期防骑的装备收集方案,上一期术士和盗贼当时的想法只是根据我自身的装备基础进行的,比如我SS和盗贼都有SW的装备基础,因此并不范用于所有玩家。本期的防骑攻略02!世乒赛大逆转,直板名将取得四连胜,国乒公布首发阵容2022年10月1日,成都世乒赛进入白热化阶段,男团中国香港32险胜伊朗,差点爆出冷门,中国香港队连赢伊朗和匈牙利,直板名将黄镇廷四次出场取得全胜,在对阵阿拉米安的比赛,黄镇廷02训练营第4天,湖人锁定了首发阵容!其中一人休战了一整个赛季今日,湖人迎来新赛季训练营第四天,施罗德依旧没有归队,还在处理签证问题。球队官方继续发布一系列照片,詹姆斯喜笑颜开,状态不错。在训练前,驱车前往湖人球馆的路上,詹姆斯坐在车内听歌自鲁媒客战梅州,泰山队只能派费莱尼克雷桑莫伊塞斯三外援直播吧10月1日讯据济南时报报道,10月1日,泰山队现役球员见面会在济南龙湖奥体天街举行。刘彬彬费莱尼贾德松三名球员现场与球迷进行互动。根据安排,泰山队将于明日启程前往梅州,与梅州愿我的电池一直有电,愿我的灵魂一直有伴想念是一种神奇的力量,她开心我也开心,我也来心,她快乐我也快乐。不知不觉她已经成了我的牵挂,我早上想她,中午想她,晚上想她。这辈子不还没有这样喜欢过一个人。何其有幸,认识你。何其有长风送客船,两处相思何日了,空留明月照无眠向南天,长风送客船,两处相思何日了,空留明月照无眠。万里征程不畏难,大雁向南天,秋风萧瑟相思共月圆。漫天飞,两处相思各自悲,一行人字远,关山万里梦魂归。一行雁字寄相思,万里云天共此凉爽的八仙洞美丽的小树林凉爽的八仙洞四九班牧钰博指导老师赵晓娜我喜欢去美丽的白羽公园,也喜欢去新奇的仲景小镇,更乐意去游乐场玩但我最喜欢去的地方是凉爽的八仙洞。八仙洞位于淅川县丹江水库旁边。从西峡出发,坐今年秋天又火了一条裙子,叫呢子裙,时髦高级,一看就不便宜山河依旧,秋意渐浓,这两天出门,单薄的衣服已经有些穿不住了,浓郁的秋色推动着穿衣的变革,唯有厚实细腻的质感面料才能那与秋季氛围感相辅相成。今年秋天又火了一条裙子,叫呢子裙,时髦高级不植发不用药,如何实现发量逆袭?岁月是把无情的杀猪刀,也是最猛的脱毛膏。不知道哪天一照镜子,突然发现自己脸垮发腮头发稀疏,不但一事无成还越来越丑,年龄颜值焦虑说来就来。图片来源视频截图我想无论是谁,都会在意自己的今秋穿长裤流行盖一半脚面,不试试真不知道有多显高显腿长气温下降,作为一个养生人士也不得不忍痛割爱将裙子收入衣柜,秋季当然是裤装的主场啦。但是琳琅满目的裤子单品中我们应该选择什么呢?小编有个穿搭小技巧,那就是根据季节的氛围去选择穿搭。夏国乒男女团成都世乒赛团体赛首秀均取得开门红中新社成都10月1日电(记者贺劭清岳依桐)10月1日晚,随着国乒女团队员王曼昱30击败17岁加拿大选手聂嘉仪,国乒男女团在2022年第56届国际乒联世界乒乓球团体锦标赛(决赛)成都马拉西亚安东尼曼联首训前,滕哈赫让我不要对他粗暴直播吧10月2日讯在曼市德比前,曼联后卫马拉西亚在接受采访时,谈到了安东尼曼联首训前,球队主帅滕哈赫对自己的叮嘱。马拉西亚表示,滕哈赫要求自己不要对安东尼太粗暴。马拉西亚这样谈道我疯狂53!西甲进球大战,久保健英破门,赫罗纳连丢3球,轰然倒下北京时间10月3日凌晨的一场西甲比赛中,赫罗纳和皇家社会进行了一场进球大战,踢出了疯狂的大比分。比赛刚刚开始7分钟,客战作战的皇家社会就收获了进球。久保健英在左侧送出横传,后点包抄54岁杨澜看脸是真的老了,但穿衣优雅又温柔,气质太高级了在时尚的长河里唯有经典才能永久留存被人铭记,在众多时尚风格中,很多潮流风格都是昙花一现,只有优雅风是永远不会过时的经典,这种风格不挑年龄,即使容颜老去也丝毫没有影响,经过岁月沉淀下奥运冠军龙清泉退役后发福不少,妻子比他更高,转型很成功中国体坛有不少梦之队,乒乓球队当得起这个称号,跳水队和举重队同样当得起这个称号。这些项目都是夺金大户,在每次世界大赛上,都能斩金夺银,成绩十分出色。其中举重队也有着很强大的统治力,
最值得推荐的电视剧佛陀,一个真实的佛陀的成佛路(第四集)哈喽,大家好,我是山河,上一集我们分享到净饭王为了不让悉达多王子看到人间疾苦悲伤,残忍的把王城中的老弱病残悉数赶出。弄得老百姓叫苦连天,还在襁褓中的悉达多王子仿佛是感受到了这人间凄爱国艺人陈小春让儿子必须学会中文,穿防弹衣开演唱会陈小春的铁粉都在监狱呢?出现这句话的原因想必大家也都知道原因,早年间他凭借电影古惑仔中山鸡一角色走红,时至今日网友们依然喜欢用山鸡哥来称呼他。古惑仔当年的影响力是显而易见的,这个系黑暗荣耀爆红,出道20多年的宋慧乔,竟是王家卫的艺人?要说最近最火的一部剧,非黑暗荣耀莫属了!这部由宋慧乔主演的复仇爽剧,虽然已经完结一个多星期了,但剧中台词和主演们的各种玩梗依旧是各大网络平台的流量密码。这剧到底有多火?这么说吧,不男团教父性侵无数男艺人,逼注射雌激素,死后竟被当伟人!!!BBC近期推出的纪录片引发了一场日本娱乐圈海啸。这部叫做掠食者日本流行音乐的秘密丑闻的纪录片,把镜头对准了一个人日本第一造星工厂杰尼斯事务所的创始人,日本流行文化教父杰尼喜多川。纪西北人去哪过春天?这个最北的南方赢麻了一到春天,陕南就变成了陕A大军,乃至西北各地旅人的出游胜地。长安古城春景虽美,但与陕南三市相比,再好的花也只能算是一日看尽,索然无味。若你自陕西的枢纽西安出发,沿着G211G210ChatGPT中国最火的十家夜店ChatGPT评选出中国最火的十家夜店,你去过几家?排名不分先后顺序北京朝阳区MIXMIX是北京著名的夜店之一,位于三里屯太古里。它主要以电子音乐为主,提供多种音乐风格和现场表演,丹麦洛兰岛一个美得让人想哭的地方!洛兰岛(Lolland)位于哥本哈根以南150公里处,是丹麦的第四大岛,那里的风光自然纯朴原生态,让人欲罢不能!而且东西南北各有各的特色,东边更文化更有历史沉淀一些西边更开阔更美南大泊口海菜花开见证滇池治理变迁来源云南日报水域清澈能见度高,绽放的海菜花犹如点点星光洒在水面上,随手一拍都是精美壁纸3月21日,昆明市滇池管理局开展阳春三月一起拍滇池海菜花活动,展示滇池保护治理成效,引导广大市文昌迎来首个澳门入境旅游团游客行程很有意义新海南客户端南海网南国都市报3月22日消息(记者吴岳文)由20名来自澳门的游客组成的2023年首个澳门入境旅游团3月18日抵达文昌,拉开了文昌春季入境游的序幕。文昌迎来首个澳门旅游河南旅游洛阳(游)头条创作挑战赛洛阳,居天下之中,有5000多年文明史4000多年城市史1500多年建都史,华夏文明的发祥地丝绸之路的东方起点隋唐大运河的中心十三朝古都,是我国建都最早历时最长朝代最免费逛280亩超大樱花园!湘潭盘龙大观园将举办汉服樱花节3月22日,盘龙大观园通过官方公众号宣布,湘潭盘龙大观园第二届汉服樱花节3月25日(本周六)起迎客。游客只要身穿汉服即可免费进入樱花园赏花,活动时间持续至4月9日,景区的营业时间为