`
sea7
  • 浏览: 5889 次
  • 性别: Icon_minigender_1
  • 来自: 火星
最近访客 更多访客>>
社区版块
存档分类
最新评论

[讨论] 如何区别和理解理解设计模式 ?

阅读更多
    学习设计模式已经有一段时间了,但经常还是会很困惑。看书上的代码会发现很多不同的设计模式的代码结构非常相似。比如 Bridge 和 Strategy 。。。

     既然是一个讨论贴,那我就先抛砖引玉,希望各位牛人赐教。。

    
     设计模式就是我们设计过程中经常出现的一些相同的情景的解决方案。它也严格遵循设计原则,几乎所有的设计模式都遵循封装变化的原则,个人觉得GOF队设计模式的分类也是根据封装变化的不同来进行的分类,创建型模式封装的是对象的创建的变化,结构型模式封装的是结构的变化,而行为型模式封装的是行为的变化。
     
      对于每个具体的模式区别则在于意图,看到网上有很多人写工厂方法模式和抽象工厂模式的区别,水平参差不齐,有的直接就从树上拷段代码,然后对着代码的结构来分析两者的区别。这样的分析对于初学而又迷惑的人来说非常的不好。

     我这只是个水帖,希望大家多来点口水,不要吝惜。。。。
分享到:
评论
54 楼 狂放不羁 2008-11-23  
我觉得设计模式容易理解,但是用好很难。
53 楼 daweiangel 2008-11-21  
410228573 写道
我是个新入行者,对设计模式也是了解不理解,因为没用过,或者说没看过别人项目里面使用的设计模式,如果自己用过或者说是见过的话我自信自己能够理解。实践出真知一点不错。

你都入行了我还再门前徘徊那,羡慕!
52 楼 daweiangel 2008-11-21  
sea7 写道
woods 写道
我对模式的感觉:
1.设计模式能给你一个设计的起点,然后随后慢慢根据需要重构出适合你的项目的设计.
2.给了你一个交流的语境.(讨论时候:"恩恩 我觉得这里需要个strategy...")
3.没必要非得死靠这是某某模式,实际使用往往是某几种模式的综合
4.设计模式的核心感觉:封装变化,抽象行为,多用组合:P


同意


en tongyi
51 楼 410228573 2008-11-21  
我是个新入行者,对设计模式也是了解不理解,因为没用过,或者说没看过别人项目里面使用的设计模式,如果自己用过或者说是见过的话我自信自己能够理解。实践出真知一点不错。
50 楼 dxiao2 2008-11-20  
我觉得看看书 了解下设计模式的大概几个就行了
然后在自己工作中设计类的时候 想想自己的需求和目的 然后套套设计模式
多用用几次就自然而然全理解了
49 楼 xixix2004 2008-11-19  
我学习设计模式的方法是不急着去看代码,而是先理解他的定义,在网上查找此设计模式的使用场合.因为设计模式而言,本身就应该是脱离代码层面的.

但是学习了一段时间以后我就放弃,因为说实在的,实在没有意义.为了设计模式而设计模式不可取.
48 楼 yunhaifeiwu 2008-11-19  
sea7 写道
H_eaven 写道
sea7 写道
tianmo2008 写道
jeff.chuh 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.


你是没发现工厂用到什么地方,
当然对于ArrayList在代码里你可以到处new,
因为ArrayList的实现是稳定的,不需要你实现一个MyArrayList,
但是有些情况不一样,
比如有个FileLogger,从名字看出它是向文件输出log的实现类,
但你并不能保证你做好的项目以后不会变成向DB输出log,
这时你又实现了DBLogger,这时你发现FileLogger被new到各个地方,
你不得不一个个都替换成DBLogger。
而如果使用工程的话,你只需要修改工厂的实现就可以了,甚至你工厂是读取配置文件得到FileLogger的,
那么你只需要修改配置文件就可以了。

至于接口,你可以找找为什么要面向接口编程,这样做可以给你带来什么。

宏光点来看工厂模式的话,我是可以理解工厂的优势的,但现在是在工厂模式里面细分简单工厂、工厂方法和抽象工厂的时候,我个人觉得工厂方法在简单工厂和抽象工厂之间成了鸡肋,简单工厂和抽象工厂我都可以找到他们的应用场合,但工厂方法我却找不到,因为我目前接触的需求,要么就直接用简单工厂了事(尤其在配合反射的情况下),要么就直接分类后用抽象工厂,而没有考虑工厂方法的地方,所以觉得工厂方法很不好理解。
注意,我只是冲着工厂方法,而不是冲着整个工厂模式。


有这样一个case,现在你需要有一个生产某种品牌电脑的factory,请问你会使用简单工厂吗?
如果你使用简单工厂,那要是有一天有一个新的品牌的电脑呢??这个时候你需要怎么办??


简单工厂加反射,很强大.

也许这样是可以实现,但你是否想到性能,反射必须会影响性能,而此时使用工厂方法则更为恰当,我们不只是要解决问题,而是要用最合理的方式解决问题.



反射 在框架中无处不在。spring struts 等等都使用了反射。到目前为止,反射对性能的影响,也没怎么考虑了。

服务器,不会还用上几代的吧

47 楼 tibetjungle 2008-11-18  
Ivan_Pig 写道
书看了有两遍,感觉还是很肤浅。
我直到项目开发,才体会到设计模式的用途,感觉看书看不出什么来。

正解啊。
另外,gof书上的那些代码是经典,但不是说在项目里用各种语言去实现。实际应用中还是可以变通一下的。不要太教条!
46 楼 wcleye 2008-11-17  
设计模式 个人觉得没必要学,记得前几个月我还不知道它是什么东西,但是整天在同事口里听到它,后来找来资料一看,原来这模式在项目中大部分都用过,只是不知道它的专业术语而已,现在看到有人整天把设计模式挂在嘴边,我不想多说什么,模式重在理解和实践中的体会,难道照着书本写几个例子就能弄懂设计模式吗?

时机到了,自然就懂了..
45 楼 sea7 2008-11-17  
H_eaven 写道
版主把这贴给删除了,
发错了.



不明白你的意思???
44 楼 sea7 2008-11-17  
H_eaven 写道
sea7 写道
tianmo2008 写道
jeff.chuh 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.


你是没发现工厂用到什么地方,
当然对于ArrayList在代码里你可以到处new,
因为ArrayList的实现是稳定的,不需要你实现一个MyArrayList,
但是有些情况不一样,
比如有个FileLogger,从名字看出它是向文件输出log的实现类,
但你并不能保证你做好的项目以后不会变成向DB输出log,
这时你又实现了DBLogger,这时你发现FileLogger被new到各个地方,
你不得不一个个都替换成DBLogger。
而如果使用工程的话,你只需要修改工厂的实现就可以了,甚至你工厂是读取配置文件得到FileLogger的,
那么你只需要修改配置文件就可以了。

至于接口,你可以找找为什么要面向接口编程,这样做可以给你带来什么。

宏光点来看工厂模式的话,我是可以理解工厂的优势的,但现在是在工厂模式里面细分简单工厂、工厂方法和抽象工厂的时候,我个人觉得工厂方法在简单工厂和抽象工厂之间成了鸡肋,简单工厂和抽象工厂我都可以找到他们的应用场合,但工厂方法我却找不到,因为我目前接触的需求,要么就直接用简单工厂了事(尤其在配合反射的情况下),要么就直接分类后用抽象工厂,而没有考虑工厂方法的地方,所以觉得工厂方法很不好理解。
注意,我只是冲着工厂方法,而不是冲着整个工厂模式。


有这样一个case,现在你需要有一个生产某种品牌电脑的factory,请问你会使用简单工厂吗?
如果你使用简单工厂,那要是有一天有一个新的品牌的电脑呢??这个时候你需要怎么办??


简单工厂加反射,很强大.

也许这样是可以实现,但你是否想到性能,反射必须会影响性能,而此时使用工厂方法则更为恰当,我们不只是要解决问题,而是要用最合理的方式解决问题.
43 楼 H_eaven 2008-11-17  
简单工厂封装new XXX()到一个地方,便于修改.
工厂方法封装new XXX()到一个地方,便于扩展.
42 楼 H_eaven 2008-11-17  
sea7 写道
tianmo2008 写道
jeff.chuh 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.


你是没发现工厂用到什么地方,
当然对于ArrayList在代码里你可以到处new,
因为ArrayList的实现是稳定的,不需要你实现一个MyArrayList,
但是有些情况不一样,
比如有个FileLogger,从名字看出它是向文件输出log的实现类,
但你并不能保证你做好的项目以后不会变成向DB输出log,
这时你又实现了DBLogger,这时你发现FileLogger被new到各个地方,
你不得不一个个都替换成DBLogger。
而如果使用工程的话,你只需要修改工厂的实现就可以了,甚至你工厂是读取配置文件得到FileLogger的,
那么你只需要修改配置文件就可以了。

至于接口,你可以找找为什么要面向接口编程,这样做可以给你带来什么。

宏光点来看工厂模式的话,我是可以理解工厂的优势的,但现在是在工厂模式里面细分简单工厂、工厂方法和抽象工厂的时候,我个人觉得工厂方法在简单工厂和抽象工厂之间成了鸡肋,简单工厂和抽象工厂我都可以找到他们的应用场合,但工厂方法我却找不到,因为我目前接触的需求,要么就直接用简单工厂了事(尤其在配合反射的情况下),要么就直接分类后用抽象工厂,而没有考虑工厂方法的地方,所以觉得工厂方法很不好理解。
注意,我只是冲着工厂方法,而不是冲着整个工厂模式。


有这样一个case,现在你需要有一个生产某种品牌电脑的factory,请问你会使用简单工厂吗?
如果你使用简单工厂,那要是有一天有一个新的品牌的电脑呢??这个时候你需要怎么办??


简单工厂加反射,很强大.
41 楼 sea7 2008-11-16  
zcclark 写道
建议多看看Spring的代码,了解一下IOC,你会对工厂模式有更深的理解。
而且Spring写的代码质量也很高。


spring的源码,真的没有怎么看,但对于IOC还是比较了解的,不过我觉得也许叫做DI会更合适
40 楼 sea7 2008-11-16  
tianmo2008 写道
jeff.chuh 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.


你是没发现工厂用到什么地方,
当然对于ArrayList在代码里你可以到处new,
因为ArrayList的实现是稳定的,不需要你实现一个MyArrayList,
但是有些情况不一样,
比如有个FileLogger,从名字看出它是向文件输出log的实现类,
但你并不能保证你做好的项目以后不会变成向DB输出log,
这时你又实现了DBLogger,这时你发现FileLogger被new到各个地方,
你不得不一个个都替换成DBLogger。
而如果使用工程的话,你只需要修改工厂的实现就可以了,甚至你工厂是读取配置文件得到FileLogger的,
那么你只需要修改配置文件就可以了。

至于接口,你可以找找为什么要面向接口编程,这样做可以给你带来什么。

宏光点来看工厂模式的话,我是可以理解工厂的优势的,但现在是在工厂模式里面细分简单工厂、工厂方法和抽象工厂的时候,我个人觉得工厂方法在简单工厂和抽象工厂之间成了鸡肋,简单工厂和抽象工厂我都可以找到他们的应用场合,但工厂方法我却找不到,因为我目前接触的需求,要么就直接用简单工厂了事(尤其在配合反射的情况下),要么就直接分类后用抽象工厂,而没有考虑工厂方法的地方,所以觉得工厂方法很不好理解。
注意,我只是冲着工厂方法,而不是冲着整个工厂模式。


有这样一个case,现在你需要有一个生产某种品牌电脑的factory,请问你会使用简单工厂吗?
如果你使用简单工厂,那要是有一天有一个新的品牌的电脑呢??这个时候你需要怎么办??
39 楼 sea7 2008-11-16  
太郁闷了,发这个帖子是希望大家能有一个讨论,并不是什么希望别人给自己提意见如何学习设计模式的帖子,但有些人却一直在给我提着各种建议
晕。。。
38 楼 xiaobin268 2008-11-16  
一看就晕的人飘过
37 楼 kloudan 2008-11-15  
sea7 写道
Ivan_Pig 写道
sea7 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.

工厂方法,使得对象的创建和使用者分离,封装了对象创建的变化。当你的对象创建有变化时,你只需要更改工厂方法,而不需要在你的代码中到处去修改new。


概念挺熟的。有多少人开发的时候就知道用什么模式呢?都是重构出来的。代码敲多了,就知道哪里重复太多了,修改就变得自然而然了。


开发中尝到甜处了,嘿嘿

只有对设计模式了熟于心,才会恰当的用。


厉害
36 楼 viita_boy 2008-11-15  
我感觉对于设计模式没有必要专门的针对性学习,说白了,那是前人经过多少个项目而总结的成熟一点的编码实现经验,就是用最少的功,办最多的事!你要说它的作用其实是提倡代码的结构高效利用性也可以,但是回头想想,这样做的目的其实方便了以后代码的维护,到底!! 也还是用最少的功,办最多的事。经验可以学习,但没有必要生搬硬套,或者说我这几个星期一定要把设计模式学好,没有这个必要,前人的经验只有加入我们自己的项目中,加入了我们自己的思想和简介,才会真正变成属于我们自己的东西,正所谓,站到前人的肩膀上,看到属于我们自己的东西 ,这次叫做进步!
  这是本人对于设计模式的一种理解  套用一句忒俗的话:软件的学习是用来学习思想的!  有了一定的软件思想的人,就不会再去担心什么语言是未来的主宰 或者说想进入IT行业的新人还在那思考着到底JAVV好呢还是.NET好,有了思想,任何一种新的语言出现,对于我们来说只是熟悉一下便可上手的   正所谓:万变不离其宗!
   什么是电脑:代替
人们作出更多的事情!
35 楼 calmness 2008-11-15  
设计模式的书看了也没多大用处,那么多个设计模式真的要去辨别不同点以及使用,实在是舍本求末,设计系统的时候,只需要掌握几点基本的设计原则即可,只有在写代码的过程中,你才能逐步发现怎么样写才能将代码写好,当然这个过程是漫长的,不是靠看一本设计模式就可以做到的,所以设计模式只能作为一个参考吧,别当成是圣经就行了。

相关推荐

    设计模式(包含5个设计模式)含源代码报告.rar

    这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细的类图、源代码以及文档报告,这对于学习和理解设计模式至关重要。 首先,我们要探讨...

    设计模式之蝉

    书中包含了作者的个人读书笔记,这表明除了正文内容之外,作者还提供了自己的理解与见解,这些笔记可能对理解设计模式的精髓与实际应用有很大的帮助。 在内容部分,我们可以看到有关于设计模式的一些具体讨论,例如...

    新版设计模式手册 - C#设计模式(第二版)

    在C#设计模式(第二版)中,作者可能会深入讨论每种模式的动机、结构、参与者、协作方式以及优缺点。同时,书中还会通过实际的C#代码示例来演示如何在项目中应用这些模式,帮助读者理解模式背后的意图和使用场景。 ...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    此外,张容铭的这本书很可能还会深入讨论JavaScript语言特性如何与设计模式相结合,例如原型继承、闭包和动态类型等在实现设计模式时的独特作用。书中可能会有丰富的实例和代码示例,帮助读者理解和实践这些模式。 ...

    java 设计模式 英文版

    本文的深入探讨将帮助读者理解设计模式如何在实际编程中发挥作用,通过具体的例子和应用场景来阐述每个模式的用法和价值。通过学习这些设计模式,开发者可以更好地应对复杂的软件设计挑战,写出更加优雅和高效的代码...

    23种设计模式详细介绍与区别

    在提供的文档《设计模式.docx》和图表《设计模式.vsdx》中,你将找到更详尽的解释和示例,帮助你更好地理解和应用这些设计模式。通过阅读和研究这些材料,你可以深入探索每种模式的细节,从而提升你的软件设计能力。

    设计模式可复用面向对象软件的基础(C++)——强烈推荐

    首先,我们需要理解设计模式的基本分类。设计模式通常分为三类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建,如单例模式、工厂模式和建造者模式,它们旨在提供一种灵活的、抽象的对象创建方式。...

    JAVA设计模式-chm版

    4. 参与讨论和分享,与其他开发者交流设计模式的理解和应用。 总之,“JAVA设计模式-chm版”资源对于深入理解并掌握Java设计模式具有很高的价值。通过学习和实践,开发者可以提升自己的编程技能,编写出更加高效、...

    head设计模式+设计模式解析(第二版).rar

    《Head First 设计模式》以其独特的视觉风格和易于理解的方式,为初学者提供了设计模式的入门指南。书中涵盖了23种经典的GOF(GoF,Gang of Four)设计模式,包括创建型模式(如单例模式、工厂模式)、结构型模式...

    设计模式学习总结.doc

    在《设计模式学习总结》中,作者通过自己的学习经历和实际应用,分享了对23种经典设计模式的理解和感悟。这篇文档主要讨论了设计模式的概念、作用、应用以及学习设计模式时应注意的误区。 设计模式起源于面向对象...

    碾磨设计模式.pdf

    设计模式不仅仅是技术上的技巧,更是理解和掌握面向对象设计思想的关键。"研磨设计模式"通过实例解析,帮助读者理解这些模式如何在实际项目中应用,从而提升软件设计能力。通过阅读和实践这些模式,开发者可以更好地...

    java设计模式PPT

    首先,我们要理解设计模式的核心概念。设计模式不是代码,而是解决软件设计中反复出现的问题的模板或指南。它们提供了一种标准的解决方案,帮助开发者在面对复杂性时保持代码的可读性、可维护性和可扩展性。在JAVA中...

    设计模式 (20种设计模式代码详解)

    这些设计模式的代码实现将帮助读者更直观地理解和应用它们。记住,设计模式并非银弹,而是工具,理解其背后的意图和应用场景至关重要。在实际开发中,灵活地组合和运用设计模式,可以使代码更加健壮、可维护,提高...

    设计模式-王翔 全本

    这不仅有助于个人技能的提升,也有利于团队间的沟通和协作,因为设计模式提供了一种共同的语言和理解基础。通过掌握设计模式,开发者能够在面对复杂系统设计时更加游刃有余,更好地应对软件开发中的挑战。

    设计模式大全C++.rar

    这本书可能会深入讨论C#中的特性如何与设计模式结合,比如接口和泛型如何支持策略模式,事件和委托如何与观察者模式协同工作。此外,它可能还会包含一些.NET框架下的设计模式,如依赖注入和面向服务架构。 通过学习...

    设计模式的几本书

    在面向对象设计原则的基础上,《Java设计模式》第二版还可能深入讨论Java语言特有的一些设计模式实现方式,如策略模式与Java枚举的结合使用,以及模板方法模式在异常处理中的应用。策略模式允许在一个类的行为中选择...

    设计模式C#版

    复习面向对象的三大特性:封装、继承和多态,是理解设计模式的基础。封装让对象的实现细节对外部隐藏,继承实现了代码的复用,多态则允许不同类的对象对同一消息做出响应。 二、设计模式举例 设计模式的种类很多,...

    侯捷 侯俊杰 设计模式 同济大学 课件

    5. **设计原则**:深入讲解面向对象设计的基本原则,如开闭原则、单一职责原则、里氏替换原则、依赖倒置原则和接口隔离原则,这些都是理解设计模式的基础。 6. **案例研究**:结合实际项目或知名库(如Spring框架)...

    设计模式精解-pdf.zip

    《设计模式精解》是一本深受读者喜爱的设计模式经典书籍,它为初学者和有经验的开发者提供了深入理解和应用设计模式的宝贵资源。设计模式是软件工程中的重要概念,它们是针对常见问题的经过验证的解决方案,可以在...

Global site tag (gtag.js) - Google Analytics