`
scanfprintf123
  • 浏览: 80245 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

学习设计模式的一个硬伤

阅读更多

     很多人在学习设计模式,也都能把GOF书中的factory, state, singleton, decorator等等说的叽里呱啦的,但是很多人其实都不知道怎么来用设计模式,工作几年,看过一些优秀的设计,但看过的更多的是滥用模式的设计,大部分人对设计模式的了解也都停留在层面上,在工作中曾有机会去对资历年长过自己的同行进行过面试,GOF中的模式随便挑一些出来问询,模式的用途,解决的问题以及优缺点什么的,大部分都能答个八九不离十,但是再往深入点,比如问,state与strategry的区别?或者两个维度的业务变化可以用Bridge来分离,那面对大于两个维度的业务变化时呢? 对于此类稍微深入点的问题,面试者往往不知如何作答。

      或许是交际圈太窄,在现实生活中还没有接触到传说中的大牛,能够给予点播,以致往往在遇到问题时,只能闷着头颅去网络中四处寻找,然而网络中大多数人的理解显然都还是停留在理论层面,甚少有实际运用的例子,以致在某些时候,使用了模式后和使用之前没多大区别,有点画蛇添足的味道。

      举个工厂模式的例子,大多数文章都只是描述了工厂模式是什么,为什么要用,以及优缺点什么的,却唯独少了描述如何使用。比如说,工厂模式是为了封装对象的创建,降低具体产品和Client的耦合等等,大体上就是说,原先使用new Shape的地方, 换成factory创建的方式。

//使用工厂模式前,client调用的方式
Shape shape=new Circle();


//使用工厂模式后,client调用的方式
ShapeFactory factory=new CircleFactory();
Shape shape=factory.createShape();

 

    从上面的代码中,你看出了什么不对劲的地方了吗? 如果我们真的这么来使用工厂模式,那么使不使用工厂模式没有什么两样,为什么? 使用工厂模式前,client的代码依赖于具体的产品对象-Circle,使用工厂模式后,client的代码是不依赖于具体的产品对象-Circle了,但是转而依赖具体的工厂对象-CircleFactory了,依赖关系只是转移了,并没有降低。 但是这正是网上以及一些书籍中讲解工厂模式时所使用的方式,而且鲜有说明其中的缘由。这就造成了很多初学者乃至一些工作了多年的程序员都在这样使用着设计模式。

    再举个策略模式的例子,这是一个很简单的模式,但是仍然有很多人不知道策略模式还有一个Context元素,也不知道这个Context元素的作用, 既然模式里包含了这个Context,自然有它的用意。所以,对于我来讲,未能充分了解其意图之前,设计模式,还是不用为好。

1
1
分享到:
评论
3 楼 狂放不羁 2010-04-08  

对, 你说的这个是使用工厂的另一个方面,如果仅仅是一个简单的全局控制,那么是可接受的,即具体产品只有一个,否则,那就不是工厂模式而是工厂方法,一个单例加上若干个创建不同具体对象的方法,不然还是需要工厂模式+工厂的工厂进行解耦。

软件设计确实是一门艺术,但是软件往往不能让客户和设计师同时满意,会偏向客户的满意度更多一些,在工作中,并不会有很多机会对代码进行重构,原因很简单,客户的满意度,特别是对于产品来说,如果你的产品有上千万的收费用户,你会不会经常因为你不满意但是却工作的很OK的代码进行重构?即使有单元测试+回归测试来做保证,但我仍然不会这么做,我只会发现现有的问题,并进行总结,等待一个可以重构的时机。架构师的职责很多,不仅仅是在于设计这一方面。
scanfprintf123 写道
狂放不羁 写道
但是可能多个地方都需要对象,而这个时候工厂就比new好了,同时工厂还可以提供全局控制,比如jive里面的ForumFactory,系统所有需要用Forum的地方都需要从这里来拿,这样封装了整个系统获取Forum的入口,方便控制。
总之,模式这东西,原理很简单,关键是如何能将理论和实际结合起来。也许很多人觉得,软件只要客户觉得满意就行了。但是我觉得,软件要让客户和咱们设计师或者架构师都满意。这也是我经常重构自己以前写的代码的原因。因为我现在对以前写的代码不满意,虽然重构了对客户没意义,但是对于我来说有意义。软件设计是一个艺术的过程。只有真正热爱它,把他当做兴趣,而不仅仅是工作才可以领会到其中乐趣。


对, 你说的这个是使用工厂的另一个方面,如果仅仅是一个简单的全局控制,那么是可接受的,即具体产品只有一个,否则,那就不是工厂模式而是工厂方法,一个单例加上若干个创建不同具体对象的方法,不然还是需要工厂模式+工厂的工厂进行解耦。

软件设计确实是一门艺术,但是软件往往不能让客户和设计师同时满意,会偏向客户的满意度更多一些,在工作中,并不会有很多机会对代码进行重构,原因很简单,客户的满意度,特别是对于产品来说,如果你的产品有上千万的收费用户,你会不会经常因为你不满意但是却工作的很OK的代码进行重构?即使有单元测试+回归测试来做保证,但我仍然不会这么做,我只会发现现有的问题,并进行总结,等待一个可以重构的时机。架构师的职责很多,不仅仅是在于设计这一方面。


呵呵,对。认同你的观点。我说的重构是重构自己因为兴趣而写的一些框架或者软件。对于公司的项目,目前重构的很少。
2 楼 scanfprintf123 2010-04-04  
狂放不羁 写道
但是可能多个地方都需要对象,而这个时候工厂就比new好了,同时工厂还可以提供全局控制,比如jive里面的ForumFactory,系统所有需要用Forum的地方都需要从这里来拿,这样封装了整个系统获取Forum的入口,方便控制。
总之,模式这东西,原理很简单,关键是如何能将理论和实际结合起来。也许很多人觉得,软件只要客户觉得满意就行了。但是我觉得,软件要让客户和咱们设计师或者架构师都满意。这也是我经常重构自己以前写的代码的原因。因为我现在对以前写的代码不满意,虽然重构了对客户没意义,但是对于我来说有意义。软件设计是一个艺术的过程。只有真正热爱它,把他当做兴趣,而不仅仅是工作才可以领会到其中乐趣。


对, 你说的这个是使用工厂的另一个方面,如果仅仅是一个简单的全局控制,那么是可接受的,即具体产品只有一个,否则,那就不是工厂模式而是工厂方法,一个单例加上若干个创建不同具体对象的方法,不然还是需要工厂模式+工厂的工厂进行解耦。

软件设计确实是一门艺术,但是软件往往不能让客户和设计师同时满意,会偏向客户的满意度更多一些,在工作中,并不会有很多机会对代码进行重构,原因很简单,客户的满意度,特别是对于产品来说,如果你的产品有上千万的收费用户,你会不会经常因为你不满意但是却工作的很OK的代码进行重构?即使有单元测试+回归测试来做保证,但我仍然不会这么做,我只会发现现有的问题,并进行总结,等待一个可以重构的时机。架构师的职责很多,不仅仅是在于设计这一方面。
1 楼 狂放不羁 2010-04-04  
但是可能多个地方都需要对象,而这个时候工厂就比new好了,同时工厂还可以提供全局控制,比如jive里面的ForumFactory,系统所有需要用Forum的地方都需要从这里来拿,这样封装了整个系统获取Forum的入口,方便控制。
总之,模式这东西,原理很简单,关键是如何能将理论和实际结合起来。也许很多人觉得,软件只要客户觉得满意就行了。但是我觉得,软件要让客户和咱们设计师或者架构师都满意。这也是我经常重构自己以前写的代码的原因。因为我现在对以前写的代码不满意,虽然重构了对客户没意义,但是对于我来说有意义。软件设计是一个艺术的过程。只有真正热爱它,把他当做兴趣,而不仅仅是工作才可以领会到其中乐趣。

相关推荐

    初中语文语文论文课堂浪费我们教学的硬伤

    探究性学习虽有价值,但不能将其视为唯一的学习模式,忽视接受性学习的作用。教师需根据学科特点和学生需求,灵活运用多种教学方法,以提高教学的有效性。 针对上述问题,我们需要从以下几个方面进行改进: 1. ...

    高考作文要避免六大硬伤.doc

    因此,一个好的标题应简洁明了,能够准确反映文章的主旨。 其次,审题是作文的基础,考生需要仔细分析题目含义和要求。审题错误主要有离题和偏题两种情况。离题是完全偏离话题,而偏题则是试图绕过显而易见的主旨,...

    经销商的五大错位硬伤.doc

    可以通过借鉴厂家派出的专业团队,学习他们的技术和管理经验,同时自我提升,引入外部智力资源,如咨询公司,以“借势”和“造势”来提高自身的地位和影响力。 总结来说,经销商要克服这两大错位,就需要从战略层面...

    面试亟待避免十二种“硬伤”.docx

    面试亟待避免十二种“硬伤”.docx

    学习类app运营计划书.docx

    本文档提供了一个学习类 app 的运营计划书,旨在为大学生提供一个集生活指南、学习指南、游玩指南和其他信息于一体的应用软件。该 APP 针对在校大学生,聚合大学周边衣食住行等信息,分类集中发布,方便大学生学习...

    外企面试,回避硬伤-----

    外企面试,回避硬伤。。。。。。。。。。。。。。。

    专题资料(2021-2022年)大学生求职面试谨防五大硬伤.doc

    【大学生求职面试谨防五大硬伤】 在求职面试过程中,大学生常常会犯一些常见的错误,影响他们的表现和最终的录取机会。以下五大硬伤是应届生尤其需要注意避免的: 1. **简历主次不分**:简历是求职者的第一印象,...

    经销商的五大“错位”硬伤.doc

    以下是这五个方面的问题详细解释: 1. **战略“错位”**: 经销商的战略规划往往缺失或者过于片面,多数只关注短期销量增长,这是被制造商以销量为导向的考核标准所影响。经销商倾向于选择知名度高、价格敏感的...

    OLED主要优势汇总及分析液晶技术几大硬伤

    而未来10年,被誉为次时代显示技术OLED(Organic Light EmitTIng Diode,有机发光二极管)有一定的机率取缔液晶技术,成就一番霸业CRT体积庞大而被淘汰,那么液晶技术又有哪些硬伤遭到OLED的威胁呢?

    《商品房预售合同示范文本》的亮点与硬伤.pptx

    尽管如此,示范文本也存在一些明显的硬伤。首先,商品房的基本信息提供不充分(第3条),可能导致信息不对称的问题。其次,付款义务未考虑不可抗力因素(第8条),可能使买受人在某些情况下陷入困境。再次,买受人...

    农村小学英语的现状.doc

    【农村小学英语现状分析】 农村小学英语教学的开展在提升农村孩子文化素养方面起到了积极作用,但面临诸多挑战。...只有这样,我们才能真正缩小城乡教育差距,让每一个孩子都有平等接受优质英语教育的机会。

    卫哲:B2B的五大本质与十大核心.pdf

    这一点非常关键,因为我们在设计2B产品的时候一定要清楚,绝对不要以为你的产品是给企业用的,你要问的问题应该是,这个产品是给企业中的谁用的,哪一个岗位用到的。很多B2B企业的硬伤就在于它想的只是为企业做服务...

    listary Windows下的搜索软件

    让我最深有感触的一个情境...系统虽然不停的升级,但是核心的文档操作方式和方法并没有显著的改善,所以频繁双击、查找、另存都是系统的一个硬伤。为此,许多辅助软件得以出现以提高效率,Listary就是这类软件之一。

    建筑户型优化设计PPT教案.pptx

    【建筑户型优化设计】是房地产行业中一个至关重要的环节,它涉及到地产住宅产品的核心竞争力——居住体验。优化设计的目的是为了使建筑户型更加合理和完善,提高空间利用率,满足住户的实际需求,增强产品的市场吸引...

    jive.chm

    系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 <br> 设计模式 1 大道至简-Java之23种模式一点就通 2 设计模式...

    江苏省苏州陆慕高级2018_2019学年高一语文5月月考试题.doc

    总结:科幻作品中的"硬伤"是其特性之一,它们既可能是作品的瑕疵,也可能成为推动故事发展的关键。科幻电影在创作中需要在科学真实性和艺术想象间找到平衡,而观众对这些"硬伤"的理解和接纳程度,反映了他们对科幻...

    江苏省苏州陆慕高级中学2020学年高一语文5月月考试题.doc

    - 科幻作品的硬伤反映了科学与幻想之间的矛盾,这种矛盾是科幻艺术魅力的来源之一。 4. **科幻作品在中国的发展**: - 在中国,科幻作品曾因被指责为“反科学”以及要求符合现有科学理论而受到限制,这影响了科幻...

Global site tag (gtag.js) - Google Analytics