城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

工厂方法演进

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

谷歌Pixel系列路线图曝光明年推出折叠屏,不再每年更新A系近日,有外媒曝光了一份可能是谷歌Pixel系列手机的产品更新路线图,该路线图显示后续谷歌Pixel系列将做出不小调整,并且他们还将会推出折叠屏新机。根据路线图消息,谷歌可……上小学之前,只因走错一步路,孩子成绩出现危机!过来人好心酸大家好,我是高级家庭教育指导师爱心。表妹在孩子上小学之前,就坚持,还没上学时,一定让孩子玩得开心,不学学校内容。专门找了一家幼儿园,希望孩子玩得好,结果,上小学后,表妹为……北交所首个指数将于11月21日正式上线新华社北京11月4日电(记者姚均芳)北京证券交易所11月4日宣布,北交所首个指数北证50成份指数将于2022年11月21日正式发布实时行情,以反映市场整体运行情况,提供投资标的……工厂方法演进最近review代码,感觉工厂方法使用的不准确,正好以此为例聊一下工厂方法的演进。实例初始需求假设我们有一个需求,需要根据不同的信号做不同的事情,如做饭、吃饭。在此……智能泊车有多硬核!这是可以说的吗智能泊车有多硬核?这是可以说的吗又到了一年一度高考月,在之前的粉丝留言中,我们看到有鹏友询问:马上要出分填报高考志愿啦,对智能驾驶行业很感兴趣!小编能不能科普一下小鹏智能……中国联通录用149人,北邮登顶,西电无人反而西安邮电大学有1中国联通公布了2022年招录的149名应届毕业生名单,其中北邮毫无意外地再次登顶,确实三大运营商中北邮占据着绝对优势,与之相对的西安电子科技大学在去年无人录取之后今年再次无人被……分娩故事预告有惊无险的分娩之夜,做妈妈真是百感交集分娩故事记录新生命的诞生,讲述女性成长故事母爱好时光本节目由黑龙江都市女性广播《母爱好时光》节目与黑龙江省助产学会联合推出,带您感受分娩之痛……100天!马鞍山签下近500亿大单12月16日,马鞍山市招商引资百日攻坚行动集中签约仪式举行,共签约14个项目,总投资257亿元。天能电池集团(马鞍山)新能源科技有限公司总经理杨勇、人民控股集团有限公司副……U20男足亚洲杯预选赛中国队晋级,决赛阶段将于明年举行据中国足球队官方微博消息,在2023年亚足联乌兹别克斯坦U20亚洲杯预选赛的比赛中,中国队0:1负于沙特阿拉伯队,以预选赛A组第二身份晋级U20亚洲杯决赛阶段比赛。本届U……王心凌将登2023年兔年央视春晚!御用发型师不小心透露线索王心凌网传,王心凌有可能参加2023年兔年央视春晚的录制!王心凌2022年因《乘风破浪的姐姐3》而爆火,人气席卷全亚洲!现在可谓炙手可热,有多档节目邀约,广告更是接……爱因斯坦的质能公式?每个人都是行走的核弹?关于超光速爱因斯坦是我们熟知的天才物理学家,他开创了现代科学技术新纪元,被公认为是继伽利略、牛顿之后最伟大的物理学家,也是批判学派科学哲学思想之集大成者和发扬光大者。关于他的科学成……懂得微笑人才不会在困境中恐惧懂得给予我才知道缘分冥冥中相遇或许,天没有下不完的雨。只有,没尽头的恐惧!或许,人没有填不满的恨。宽容,才能把仇恨都抹去!我是一个不信命的人。小时候两岁半父母离异,把我扔给爷爷奶奶抚养。时间不长,父母……
刚夺冠就分手?击败奥沙利文的中国斯诺克名将女友你永远拒绝我风景就在曲径通幽处寻访高句丽新城遗址红米K50至尊版年度真旗舰1亿像素120瓦快充骁龙82999海清教室里抽烟,黄磊怒吼不想上学回家去!海清关你屁事ampampquot拳王一家ampampquot轩轩邹市明左昨晚,22战全胜19次KO的杀手拳王8回合TKO对手北京奥运会背包质量有多好,外国记者爱不释手,背了十多年还没坏好一个温暖如春的去处官方!23岁华裔名将确诊,曾获短道速滑奥运冠军,能否来北京存早上6点!武磊最新表态引爆争议,球迷吐槽你就不适合打首发决战日本前,李霄鹏郑智把一项研究反复做5次,不学李铁输球输人大耳垂适合什么耳环轻松打造气场国家赔偿司法援助分别是什么意思?暑病老人不能吃什么地震海啸的速度是多少作响造句用作响造句大全不做小皇帝智能拖拉机引领农机智能化发展助力国产农机弯道超车娱乐圈让人刮目相看的明星星座长津湖被投诉太血腥不适合孩子观看。这种家长是哪类型的人?塑料地漏堵了怎么办“言入黄花川,每逐青溪水。”全诗意思,原文翻译,赏析泡沫灭火器的原理

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找