第1页共38页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共38页设计模式的理解研读GOF的"设计模式"和阎宏博士的"Java与模式"已经有一段时间,自己颇有一些体会,自己面向对象和软件设计模式有了一些深入的理解,下面就一步一步开始自己的模式历程吧,从最简单的工厂模式到适配器模式,从State模式到Decorator模式,一直到最复杂难懂的visitor模式,没有一个模式不体现了前辈的聪明才智,需要我们大家用心去体会和理解恰当地使用设计模式,能使软件系统的架构更合理,能使将来的维护和修改更方便,能使数据库表结构的设计更合理,恰当的冗余和数据关联,能使我们的软件更多地适应变化,总之,它的的作用是不可低估的!1,简单工厂,工厂方法和抽象工厂模式对于简单工厂来说,它的工厂只能是这个样子的publicclassSimplyFactory{/***静态工厂方法*/publicstaticProuctfactory(Stringwhich)throwNoSuchProductExcption{if(which.equalIgnoreCase("product1")){returnnewProduct1();}第2页共38页第1页共38页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共38页elseif(which.equalsIgnoreCase("product2")){returnnewProduct2();}elseif(which.equalsIgnoreCase("product3")){returnnewProduct3();}elsethrowNoSuchProductExcption("NoSuchProduct");}}}而对产品Product1,Product2,Product3,可以执行接口Product,也可以不执行接口Product(当然这样不好),这个Product接口只是用来抽象具体product用的publicinterfaceProduct{voidproductMethod1();//这些只是voidproductMethod2();voidproductMethod3();}对工厂来说,只要有这么一种产品,一般来说就要在工厂里有它的生产的方法,否则抛出异常,而要工厂生产的话,也必须下达生产什么产品的命令,至少要向工厂发出信号,让工厂足以区分是要生产什么产品,否则工厂是不知道生产哪一种产品,对于简单工厂来说,就是需要在工厂中枚举所有的产品,所以说简单工厂还是非常笨的。if(which.equalIgnoreCase("product1"))只是用来区分生产什么产品的标记值,(也可以根据产品其它属性来判断,比如产品类型,产品大小,总之能够区分是什么产品的属性,或者是与产品属性相关的变量)或者说标记值是A,生产A产品,或者工厂里定义不是这样的,我偏偏要生产B产品,或者再特殊一些,我偏偏要生产A产品+B产品,那么就要returnnewProductA()+newProductB()了。这样,我们就可以看出一个问题来,如果要能够被简单工厂生产出来,就必须在简单工厂中有能够生产出的它的方法定义,当然还需要有这个具体产品类的定义,就是有class对应,这样确保在简单工厂中new它的时候不会抛出NoSuchProduct的Exception.第3页共38页第2页共38页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第3页共38页对于工厂方法来说实质上它是让工厂实现了抽象的工厂接口,它把具体怎么生产一种东西,放在具体的工厂去实现了,所谓”延迟到子类中实现“publicinterfaceCreator{publicProuctfactory();}publicSubCreator1implentCreator{publicProuctfactory(){returnnewConcreteProduct1();}}publicSubCreator2implentCreator{publicProuctfactory(){returnnewConcreteProduct2();}}请注意:返回类型是Product型的!!这样客户端调用是直接new一个具体工厂的实例,然后命令它去生产,而对于具体工厂的父类(既工厂接口,接口完全可以改成子类继承父类来实现,只是这样不好,不符合OO的原则),它完全不知道什么产品被生产了,甚至它连那个具体工厂被实例化它都不知道抽象工厂模式抽象工厂模式主要是用来解决具体产品是有几类产品簇的问题publicinterfaceCreator{publicProuctAfactoryA();publicProuctBfactoryB();}publicinterfaceProductA//ProductA接口{}publicinterfaceProductB//ProductB接口第4页共38页第3页共38页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第4页共38页{}publicclassConCreator1implementsCreator{publicProuctAfactoryA(){returnnewConcreteProductA1();}publicProuctBfactor...