设计模式--代码样例.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

创建型模式1、工厂方法模式(FactoryMethod)工厂方法模式分为三种:11、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:举例如下:(我们举一个发送邮件和短信的例子)首先,创建二者的共同接口:[java]viewplaincopy1.publicinterfaceSender{2.publicvoidSend();3.}其次,创建实现类:[java]viewplaincopy1.publicclassMailSenderimplementsSender{2.@Override3.publicvoidSend(){4.System.out.println(thisismailsender!);5.}6.}[java]viewplaincopy1.publicclassSmsSenderimplementsSender{2.3.@Override4.publicvoidSend(){5.System.out.println(thisissmssender!);6.}7.}最后,建工厂类:[java]viewplaincopy1.publicclassSendFactory{2.3.publicSenderproduce(Stringtype){4.if(mail.equals(type)){5.returnnewMailSender();6.}elseif(sms.equals(type)){7.returnnewSmsSender();8.}else{9.System.out.println(请输入正确的类型!);10.returnnull;11.}12.}13.}我们来测试下:1.publicclassFactoryTest{2.3.publicstaticvoidmain(String[]args){4.SendFactoryfactory=newSendFactory();5.Sendersender=factory.produce(sms);6.sender.Send();7.}8.}输出:thisissmssender!22、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:将上面的代码做下修改,改动下SendFactory类就行,如下:[java]viewplaincopypublicclassSendFactory{publicSenderproduceMail(){1.returnnewMailSender();2.}3.4.publicSenderproduceSms(){5.returnnewSmsSender();6.}7.}测试类如下:[java]viewplaincopy1.publicclassFactoryTest{2.3.publicstaticvoidmain(String[]args){4.SendFactoryfactory=newSendFactory();5.Sendersender=factory.produceMail();6.sender.Send();7.}8.}输出:thisismailsender!33、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。[java]viewplaincopy1.publicclassSendFactory{2.3.publicstaticSenderproduceMail(){4.returnnewMailSender();5.}6.7.publicstaticSenderproduceSms(){8.returnnewSmsSender();9.}10.}[java]viewplaincopy1.publicclassFactoryTest{2.3.publicstaticvoidmain(String[]args){4.Sendersender=SendFactory.produceMail();5.sender.Send();6.}7.}输出:thisismailsender!总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。2、抽象工厂模式(AbstractFactory)工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。请看例子:[java]viewplaincopy1.publicinterfaceSender{2.publicvoidSend();3.}两个实现类:[java]viewplaincopy1.publicclassMailSenderimplementsSender{2.@Override3.publicvoidSend(){4.System.out.println(thisismailsender!);5.}6.}[java]viewplaincopy1.publicclassSmsSenderimplementsSender{2.3.@Override4.publicvoidSend(){5.System.out.println(thisissmssender!);6.}7.}两个工厂类:[java]viewplaincopy1.publicclassSendMailFactoryimplementsProvider{2.3.@Override4.publicSenderproduce(){5.returnnewMailSender();6.}7.}[java]viewplaincopy1.publicclassSendSmsFactoryimplementsProvider{2.3.@Override4.publicSenderproduce(){5.returnnewSmsSender();6.}7.}在提供一个接口:[java]viewplaincopy1.publicinterfaceProvider{2.publicSenderproduce();3.}测试类:[java]viewplaincopy1.publicclassTest{2.3.publicstaticvoidmain(String[]args){4.Providerprovider=newSendMailFactory();5.Sendersender=provider.produce();6.sender.Send();7.}8.}其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类3、建造者模式(Builder)工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:例子1:[java]viewplaincopy1.publicclassBuilder{2.3.privateListSenderlist=newArrayListSender();4.5.publicvoidproduceMailSender(intcount){6.for(inti=0;icount;i++){7.list.add(newMailSender());8.}9.}10.11.publicvoidproduceSmsSender(intcount){12.for(inti=0;icount;i++){13.list.add(newSmsSender());14.}15.}16.}测试类:[java]viewplaincopy1.publicclassTest{2.3.publicstaticvoidmain(String[]args){4.Builderbuilder=newBuilder();5.builder.produceMailSender(10);6.}7.}例子2:BuilderpublicinterfacePersonBuilder{voidbuildHead();voidbuildBody();voidbuildFoot();PersonbuildPerson();}ConcreteBuilderpublicclassManBuilderimplementsPersonBuilder{Personperson;publicManBuilder(){person=newMan();}publicvoidbuildbody(){person.setBody(建造男人的身体);}publicvoidbuildFoot(){person.setFoot(建造男人的脚);}publicvoidbuildHead(){person.setHead(建造男人的头);}publicPersonbuildPerson(){returnperson;}}Director(负责人、主管)publicclassPersonDirector{publicPersonconstructPerson(PersonBuilderpb){pb.buildHead();pb.buildBody();pb.buildFoot();returnpb.buildPerson();}}ProductpublicclassPerson{privateStringhead;privateStringbody;privateStringfoot;publicStringgetHead(){returnhead;}publicvoidsetHead(Stringhead){this.head=head;}publicStringgetBody(){returnbody;}publicvoidsetBody(Stringbody){this.body=body;}publicStringgetFoot(){returnfoot;}publicvoidsetFoot(Stringfoot){this.foot=foot;}}publicclassManextendsPerson{}TestpublicclassTest{publicstaticvoidmain(String[]args){PersonDirectorpd=newPersonDirector();Personperson=pd.constructPerson(newManBuilder());System.out.println(person.getBody());System.out.println(person.getFoot());System.out.println(person.getHead());}}result建造男人的身体建造男人的脚建造男人的头从这点看出,建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。所以与工厂模式的区别就是:工厂模式关注的是创建单个产品,而建

1 / 54
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功