设计模式(PatternsinJava)-htp/vww.jdon.com
设计模式(Patterns in Java) -- http://www.jdon.com 6
设计模式(PatternsinJava)--htp/www.jdon.com 建筑和软件中模式之异同 CSDN的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式 写了专门文章《探寻 k恒之道》,其中很多观点我看了很受启发,以前我也将”设计 模式”看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软件中地位,下面是 我自己的一些想法 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑,那是很讲模式的,这些都是传统文化使然,比如京剧一招一式都有套 路;中国画,也有套路,树应该怎么画法?有几种画法?艺术大家通常是创造出自己的套路,比 如明末清初,水墨画法开始成熟,这时画树就不用勾勒这个模式了,而是一笔下去,浓淡几个 叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠 再回到传统建筑中,中国的传统建筑是过分注重模式了,所以建筑风格发展不大,基本分南北 两派,大家有个感觉,旅游时,到南方,你发现古代名居建筑都差不多;北方由于受满人等少数 民族的影响,在建筑色彩上有些与南方迥异,但是很多细节地方都差不多.这些都是模式的体 由于建筑受材料和功用以及费用的影响,所用模式种类不多,这点是和软件很大的不同 正因为这点不同,导致建筑的管理模式和软件的管理模式就有很多不同,有些人认识不到这 点,就产生了可以大量使用″软件蓝领″的想法,因为他羡慕建筑中″民工”的低成本 要知道软件还有一个与建筑截然相反的责任和用途,那就是:现代社会中,计划感不上变化, 竞争激烈,所有一切变幻莫测,要应付所有这些变化,首推信息技术中的软件,只有软件能够 帮助人类去应付各种变化.而这点正好与建筑想反,建筑是不能帮助人类去应付变化的,(它 自己反而要求稳固,老老实实帮助人遮风避雨,总不能叫人类在露天或树叶下打开电脑编软 件吧) 软件要帮助人类去应付变化,这是软件的首要责任,所以,软件中模式产生的目的就和建筑不 一样了,建筑中的模式产生可以因为很多原因:建筑大师的创意;材料的革新等;建筑中这些 模式一旦产生,容易发生另外一个缺点,就是有时会阻碍建筑本身的发展,因为很多人会不思 创造,反复使用老的模式进行设计,阻碍建筑的发展 但是在软件中,这点正好相反,软件模式的产生是因为变化的东西太多,为减轻人类的负担, 将一些不变的东西先用模式固化,这样让人类可以更加集中精力对付变化的东西,所以在软 件中大量反复使用模式(我个人认为这样的软件就叫框架软件了,比如J2EE),不但没阻碍软 件的发展,反而是推动了软件的发展.因为其他使用这套软件的人就可以将更多精力集中在 对付那些无法用模式的应用上来
设计模式(Patterns in Java) -- http://www.jdon.com 7 建筑和软件中模式之异同 CSDN 的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式 "写了专门文章《探寻软件的永恒之道 》,其中很多观点我看了很受启发,以前我也将"设计 模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软件中地位,下面是 我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑,那是很讲模式的,这些都是传统文化使然,比如京剧 一招一式都有套 路;中国画,也有套路,树应该怎么画法?有几种画法?艺术大家通常是创造出自己的套路,比 如明末清初,水墨画法开始成熟,这时画树就不用勾勒这个模式了,而是一笔下去,浓淡几个 叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠. 再回到传统建筑中,中国的传统建筑是过分注重模式了,所以建筑风格发展不大,基本分南北 两派,大家有个感觉,旅游时,到南方,你发现古代名居建筑都差不多;北方由于受满人等少数 民族的影响,在建筑色彩上有些与南方迥异,但是很多细节地方都差不多.这些都是模式的体 现. 由于建筑受材料和功用以及费用的影响,所用模式种类不多,这点是和软件很大的不同. 正因为这点不同,导致建筑的管理模式和软件的管理模式就有很多不同, 有些人认识不到这 点,就产生了可以大量使用"软件蓝领"的想法,因为他羡慕建筑中"民工"的低成本. 要知道软件还有一个与建筑截然相反的责任和用途,那就是:现代社会中,计划感不上变化, 竞争激烈,所有一切变幻莫测,要应付所有这些变化,首推信息技术中的软件,只有软件能够 帮助人类去应付各种变化.而这点正好与建筑想反,建筑是不能帮助人类去应付变化的,(它 自己反而要求稳固,老老实实帮助人遮风避雨,总不能叫人类在露天或树叶下打开电脑编软 件吧). 软件要帮助人类去应付变化,这是软件的首要责任,所以,软件中模式产生的目的就和建筑不 一样了,建筑中的模式产生可以因为很多原因:建筑大师的创意;材料的革新等;建筑中这些 模式一旦产生,容易发生另外一个缺点,就是有时会阻碍建筑本身的发展,因为很多人会不思 创造,反复使用老的模式进行设计,阻碍建筑的发展. 但是在软件中,这点正好相反,软件模式的产生是因为变化的东西太多,为减轻人类的负担, 将一些不变的东西先用模式固化,这样让人类可以更加集中精力对付变化的东西,所以在软 件中大量反复使用模式(我个人认为这样的软件就叫框架软件了,比如 J2EE),不但没阻碍软 件的发展,反而是推动了软件的发展.因为其他使用这套软件的人就可以将更多精力集中在 对付那些无法用模式的应用上来
设计模式(PatternsinJava)--htp/www.jdon.com 可以关于建筑和软件中的模式作用可以总结如下 在软件中,模式是帮助人类向"变化”战斗,但是在软件中还需要和’变化直接面对面战斗的 武器:人的思维,特别是创造分析思维等等,这些是软件真正的灵魂,这种思维可以说只要 有实践需求(如有新项目)就要求发生,发生频度高,人类的创造或分析思维决定了软件的质 量和特点 而在建筑中,模式可以构成建筑全部知识,当有新的需求(如有新项目),一般使用旧的模式 都可以完成,因此对人类的创造以及分析思维不是每个项目都必须的,也不是非常重要的, 对创造性的思维的需求只是属于锦上添花(除非人类以后离开地球居住了)
设计模式(Patterns in Java) -- http://www.jdon.com 8 可以关于建筑和软件中的模式作用可以总结如下: 在软件中,模式是帮助人类向"变化"战斗,但是在软件中还需要和'变化'直接面对面战斗的 武器:人的思维,特别是创造 分析思维等等,这些是软件真正的灵魂,这种思维可以说只要 有实践需求(如有新项目)就要求发生,发生频度高,人类的创造或分析思维决定了软件的质 量和特点。 而在建筑中,模式可以构成建筑全部知识,当有新的需求(如有新项目),一般使用旧的模式 都可以完成,因此对人类的创造以及分析思维不是每个项目都必须的,也不是非常重要的, 对创造性的思维的需求只是属于锦上添花(除非人类以后离开地球居住了)
设计模式(PatternsinJava)-htp/vww.jdon.com 设计模式之 Factory 定义:提供创建对象的接口 为何使用? 工厂模式是我们最常用的模式了,著名的Jive论坛系统,就大量使用了工厂模式 为什么说工厂模式是最常用,因为工厂模式就相当于创建对象的new.工厂模式就是用来创 建对象的 比如我们有一个类 Sample我们要创建 Sample的对象 Sample sample=new Sample 如果我们要在创建 sample之前做点事情,比如,赋值等,可以使用 Sample的构造函数 Sample sample= new Sample(参数) 如果创建 sample时做的事情不是如赋值这样简单的事,可能是很长一段代码,如果也写入构 造函数中,那明显的就违背了面向对象的原则.封装 Encapsulation)和分派( Delegation 我们需要将创建实例的责任与使用实例的责任分开,使得语句 Sample sample= new Sample(参数) 就是简单的责任:使用 Sample这个实例;至于创建 Sample的任务就交给了 Factory工厂模 还有,如果 Sample有个继承如 MySample,按照面向接口编程,我们需要将 Sample抽象成 个接口 现在 Sample是接口,有两个子类 MySample和 HisSample.我们要实例化他们时,如下 Sample mysample=new MySampleo Sample hissample=new HisSampleo 随着项目的深入, Sample可能还会"生出很多儿子出来",那么我们要对这些儿子一个个实 例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程 序中是无法避免的 但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了 你会建立一个专门生产 Sample实例的工厂
设计模式(Patterns in Java) -- http://www.jdon.com 9 设计模式之 Factory 定义:提供创建对象的接口. 为何使用? 工厂模式是我们最常用的模式了,著名的 Jive 论坛系统,就大量使用了工厂模式. 为什么说工厂模式是最常用,因为工厂模式就相当于创建对象的 new. 工厂模式就是用来创 建对象的. 比如我们有一个类 Sample 我们要创建 Sample 的对象: Sample sample=new Sample(); 如果我们要在创建 sample 之前做点事情,比如,赋值等,可以使用 Sample 的构造函数: Sample sample=new Sample(参数); 如果创建 sample 时做的事情不是如赋值这样简单的事,可能是很长一段代码,如果也写入构 造函数中,那明显的就违背了面向对象的原则.封装(Encapsulation)和分派(Delegation); 我们需要将创建实例的责任与使用实例的责任分开, 使得语句 Sample sample=new Sample(参数); 就是简单的责任:使用 Sample 这个实例;至于创建 Sample 的任务就交给了 Factory 工厂模 式. 还有,如果 Sample 有个继承如 MySample, 按照面向接口编程,我们需要将 Sample 抽象成一 个接口. 现在 Sample 是接口,有两个子类 MySample 和 HisSample .我们要实例化他们时,如下: Sample mysample=new MySample(); Sample hissample=new HisSample(); 随着项目的深入,Sample 可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实 例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程 序中是无法避免的. 但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了. 你会建立一个专门生产 Sample 实例的工厂:
设计模式(PatternsinJava)-htp/vww.jdon.com public class Factory( public static Sample creator[ f(which==1) return new My Sample o else if (which==2) return new His) 那么在你的程序中,如果要实例化 My Sample时.就使用 sample=Factory creator o 这样,在整个就不涉及到 Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个 原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作 的人都深有体会,相反,官做得越高,说岀的话越抽象越笼统,范错误可能性就越少.好象我们 从编程序中也能悟出人生道理?呵呵. 好了,言归正传,既然不可避免使用 factory,那我们就认识一下工厂模式 如何使用? 工厂模式中有:工厂方法( Factory Method)抽象工厂( Abstract Factory) 上例中,我们使用的是简单的工厂方法.这两个模式没有很明显的区别,区别在于需要创建 对象的复杂程度上。如果我们创建对象的方法变得复杂了,我们就可能要将上例中 Factory 变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现 public abstract class Factory I public abstract Sample creator O public abstract Sample2 creator O public class SimpleFactory extends Factory ublic sample creator i
设计模式(Patterns in Java) -- http://www.jdon.com 10 public class Factory{ public static Sample creator(){ .... if (which==1) return new MySample(); else if (which==2) return new HisSample(); } } 那么在你的程序中,如果要实例化 MySample 时.就使用 Sample sample=Factory.creator(); 这样,在整个就不涉及到 Sample 的具体子类,达到封装效果,也就减少错误修改的机会,这个 原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作 的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们 从编程序中也能悟出人生道理?呵呵. 好了,言归正传,既然不可避免使用 factory,那我们就认识一下工厂模式. 如何使用? 工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory). 上例中,我们使用的是简单的工厂方法. 这两个模式没有很明显的区别,区别在于需要创建 对象的复杂程度上。如果我们创建对象的方法变得复杂了,我们就可能要将上例中 Factory 变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现: public abstract class Factory{ public abstract Sample creator(); public abstract Sample2 creator(); } public class SimpleFactory extends Factory{ public Sample creator(){