论坛首页 入门技术论坛

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

浏览 17101 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-11-14  
建议多看看Spring的代码,了解一下IOC,你会对工厂模式有更深的理解。
而且Spring写的代码质量也很高。
0 请登录后投票
   发表时间:2008-11-14  
设计模式描述了如何接触对象间的耦合 以及如何应对将来出现的变化   创建型模式已经很少使用 因为我们有了IoC 对象生命周期统一交给容器管理。 而另外2种结构型和行为型之所以也让我们感到用处不大  是因为设计模式描述的是对象间的通信和协作 此处的对象 是指真正的对象 是既有数据 又有行为的对象, 而在我们的企业应用中 往往是层次化思想 表示层 业务逻辑层 数据访问层 层次化过于教条 所以导致里面的大部分对象要么有行为没数据 例如Service何Dao 要么有数据没行为 例如Model  所以正是这些不是对象的对象让我们感到设计模式无从下手  但有几种模式还有很大机会使用的 例如Template Method, State, Strategy.
0 请登录后投票
   发表时间:2008-11-14  
首先,谈到设计模式之前,你得明白,为什么要进行设计。有很多人都是为了设计而设计,你扪心自问有多少时候是真的发现这里需要使用某种设计理念而使用,而非刻意去套用某种设计模式。
设计的目标是什么?首先我们之所以要设计是为了应对系统的复杂性。这种复杂可能来自软件需求、变更等等一系列的问题。而作为程序员要做的是什么?只所以要设计是要为了构造一个复用性高、稳定、健壮的系统,要做到这些你必须有理论基础和实践经验。理论基础有很多,设计模式只是其中的一种。
设计模式只是人们总结出来的应对复杂性、需求的多变性的一套固定的手段和方法,并不是你当前项目中一定能用的上的,我觉得我们总是得以高内聚、低耦合为目标来构建系统。前面有位兄弟说的很对,并不能一开始你就会得到一个良好的设计,特别是缺乏经验的时候,一定要多重构,重构是一种良好的习惯,更能帮助你培养设计思想,当以后相似的场景再出现的时候,你自然会知道该使用何种模式。
另外一种看法就是封装变化。你不要把系统的可变性变得不可收拾,就是说你需要给系统一个最稳定的抽象和最灵活的实现,让可能发生的变化出现在你预料中的地方,设计模式就是提示你在某些特定场景下,这些变化在哪里和如何封装他们。
就以楼主自己据的strategy和bridge来说,strategy是意料到变化将会出现在算法部分,那么将比算法高级的部分抽象出来,使其稳定和不需变化,而要变化的那部分算法是可以灵活的,可插拔的。而bridge则将变化放置在两个地方,而他们的关系是不发生变化的,将这种关系抽像成稳定的,不变的,而让两端的事物可以灵活变化而互不干涉。以上都是从封装变化的角度来看待设计模式的。
其实要理解设计模式,首要有丰富的经验可能帮助比较大,如果没有丰富的经验,那么对你已经拥有的代码多做重构是获得经验的一个非常好的途径,其次抛开语言本身的特征,不要被那些实现语言的特性所迷惑,他可能会让你迷失在实现层而非抽象层,如果你的眼光停留在实现层是看不见设计之美的,Robert.c.martin有句话“The quality of an object oriented application is determined far more by the quality of its analysis and design, than by the features of the implementation language.”
多重构,多思考,以上是我的一些分享,欢迎讨论。
0 请登录后投票
   发表时间:2008-11-14  
jeff.chuh 写道
tianmo2008 写道
这几天看书,工厂方法确实很不好理解,感觉没有必要,我的理解是引进工厂的目的之一是要是要隐藏掉new,但在工厂方法里,实现了工厂接口的具体工厂类自身也是要new的,这样,为什么不直接去new一个产品呢?而且和抽象工厂对比,我觉得工厂方法是定位在一个产品应该对应一个工厂类的,这样的话,没添加一个产品就得有对应的一个工厂,还得new一个工厂,这样还不如直接用产品接口,然后new一个具体产品不是更直观吗?工厂方法和接口感觉不到有什么优势.


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

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

宏光点来看工厂模式的话,我是可以理解工厂的优势的,但现在是在工厂模式里面细分简单工厂、工厂方法和抽象工厂的时候,我个人觉得工厂方法在简单工厂和抽象工厂之间成了鸡肋,简单工厂和抽象工厂我都可以找到他们的应用场合,但工厂方法我却找不到,因为我目前接触的需求,要么就直接用简单工厂了事(尤其在配合反射的情况下),要么就直接分类后用抽象工厂,而没有考虑工厂方法的地方,所以觉得工厂方法很不好理解。
注意,我只是冲着工厂方法,而不是冲着整个工厂模式。
0 请登录后投票
   发表时间:2008-11-14  
个人体会,没有设计模式。只有应用场景。一切从需求出发, 逐步重构(最好是最小重构)。然后就是多写代码,多总结,自然就水到渠成了。
  • 大小: 103.1 KB
0 请登录后投票
   发表时间:2008-11-15  
设计模式的书看了也没多大用处,那么多个设计模式真的要去辨别不同点以及使用,实在是舍本求末,设计系统的时候,只需要掌握几点基本的设计原则即可,只有在写代码的过程中,你才能逐步发现怎么样写才能将代码写好,当然这个过程是漫长的,不是靠看一本设计模式就可以做到的,所以设计模式只能作为一个参考吧,别当成是圣经就行了。
0 请登录后投票
   发表时间:2008-11-15  
我感觉对于设计模式没有必要专门的针对性学习,说白了,那是前人经过多少个项目而总结的成熟一点的编码实现经验,就是用最少的功,办最多的事!你要说它的作用其实是提倡代码的结构高效利用性也可以,但是回头想想,这样做的目的其实方便了以后代码的维护,到底!! 也还是用最少的功,办最多的事。经验可以学习,但没有必要生搬硬套,或者说我这几个星期一定要把设计模式学好,没有这个必要,前人的经验只有加入我们自己的项目中,加入了我们自己的思想和简介,才会真正变成属于我们自己的东西,正所谓,站到前人的肩膀上,看到属于我们自己的东西 ,这次叫做进步!
  这是本人对于设计模式的一种理解  套用一句忒俗的话:软件的学习是用来学习思想的!  有了一定的软件思想的人,就不会再去担心什么语言是未来的主宰 或者说想进入IT行业的新人还在那思考着到底JAVV好呢还是.NET好,有了思想,任何一种新的语言出现,对于我们来说只是熟悉一下便可上手的   正所谓:万变不离其宗!
   什么是电脑:代替
人们作出更多的事情!
0 请登录后投票
   发表时间:2008-11-16  
太郁闷了,发这个帖子是希望大家能有一个讨论,并不是什么希望别人给自己提意见如何学习设计模式的帖子,但有些人却一直在给我提着各种建议
晕。。。
0 请登录后投票
   发表时间: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,请问你会使用简单工厂吗?
如果你使用简单工厂,那要是有一天有一个新的品牌的电脑呢??这个时候你需要怎么办??
0 请登录后投票
   发表时间:2008-11-16  
zcclark 写道
建议多看看Spring的代码,了解一下IOC,你会对工厂模式有更深的理解。
而且Spring写的代码质量也很高。


spring的源码,真的没有怎么看,但对于IOC还是比较了解的,不过我觉得也许叫做DI会更合适
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics