




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
创建型设计模式--⼯⼚模式、抽象⼯⼚模式⼀、⼩案例分析1、功能需求:实现⼀个发送信息的功能,要便于扩展与维护。(1)发送信息的⼯具有很多,⽐如短信、微信、邮件、QQ等。(2)选择某个⼯具进⾏信息发送。2、⼩菜鸡去实现:(1)定义⼀个发送⼯具的⽗类(接⼝),并将各种发送⼯具作为⼦类(实现类)。(2)定义⼀个选择发送⼯具的类,⽤于调⽤发送⼯具(直接new个⼦类对象)。(3)代码实现:packagecreative.pattern.factory.noFactory;importjava.util.Scanner;/***测试类**/publicclassDemo{publicstaticvoidmain(String[]args){newSendMessage();//实例化⼀个选择发送⼯具的类}}/***定义⼀个发送⼯具的接⼝**/interfaceSender{voidsendMessage();}/***定义⼀个短信发送⼯具,实现接⼝,重写⽅法**/classShortMessageSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送短信");}}/***定义⼀个微信发送⼯具,实现接⼝,重写⽅法**/classWeChatSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送微信");}}/***定义⼀个邮件发送⼯具,实现接⼝,重写⽅法
*定义⼀个邮件发送⼯具,实现接⼝,重写⽅法**/classMailSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送邮件");}}/***定义⼀个选择发送⼯具的类*/classSendMessage{/***⽤于获取需要发送信息⼯具*/publicSendergetSenderType(){System.out.println("输⼊发送⼯具的类型(1-3):");System.out.println("1:短信");System.out.println("2:微信");System.out.println("3:邮件");Scannerscanner=newScanner(System.in);StringsenderType=scanner.nextLine();if("1".equals(senderType)){returnnewShortMessageSender();}elseif("2".equals(senderType)){returnnewWeChatSender();}elseif("3".equals(senderType)){returnnewMailSender();}else{returnnull;}}publicSendMessage(){do{Sendersender=getSenderType();//选择发送信息的⼯具if(sender==null){System.out.println("欢迎下次使⽤");break;}else{sender.sendMessage();}}while(true);}}(4)代码分析:对于逻辑简单的代码,这样实现没有问题,但是逻辑稍微复杂⼀些且需要修改扩展某个地⽅时,需要改动很多地⽅。⽐如:再增加⼀个QQSender,其需要实现Sender接⼝,并重写相关⽅法,然后需要在SendMessage类中去修改相关代码,这⾥违反了开闭原则。若需要增加⼏个SendMessage类,⽐如SendMessage2、SendMessage3时,同样需要改动很多代码。(5)UML图:
⼆、简单⼯⼚模式(SimpleFactory)1、什么是简单⼯⼚模式:简单⼯⼚模式属于创建型模式,不属于常见的23种常见模式。简单的讲简单⼯⼚模式是由⼀个⼯⼚对象决定创建出哪⼀类产品的实例。2、使⽤:(1)简单⼯⼚模式,定义了⼀个创建对象的类,然后由这个类来封装实例化对象的操作。(2)当需要⼤量创建某种类或者对象时,可以使⽤⼯⼚模式。3、使⽤简单⼯⼚模式实现:(1)定义⼀个发送⼯具的⽗类(接⼝),并将各种发送⼯具作为⼦类(实现类)。(2)定义⼀个⼯⼚类,⽤于调⽤发送⼯具。(2)定义⼀个选择发送⼯具的类,⽤于调⽤⼯⼚类。(3)代码实现:packagecreative.pattern.factory.simpleFactory;importjava.util.Scanner;/***测试类**/publicclassSimpleFactoryDemo{publicstaticvoidmain(String[]args){newSendMessage();}}/***定义⼀个发送⼯具的接⼝**/interfaceSender{voidsendMessage();voidsendMessage();}/***定义⼀个短信发送⼯具,实现接⼝,重写⽅法**/classShortMessageSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送短信");}}/***定义⼀个微信发送⼯具,实现接⼝,重写⽅法**/classWeChatSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送微信");}}/***定义⼀个邮件发送⼯具,实现接⼝,重写⽅法**/classMailSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送邮件");}}/***使⽤简单⼯⼚模式,管理需要⽣产的对象**/classSimpleFactory{/***⽤于获取需要发送信息⼯具*/publicstaticSendercreateSender(){System.out.println("输⼊发送⼯具的类型(1-3):");System.out.println("1:短信");System.out.println("2:微信");System.out.println("3:邮件");Scannerscanner=newScanner(System.in);StringsenderType=scanner.nextLine();if("1".equals(senderType)){returnnewShortMessageSender();}elseif("2".equals(senderType)){returnnewWeChatSender();}elseif("3".equals(senderType)){returnnewMailSender();}else{returnnull;}}}
/***定义⼀个选择发送⼯具的类*/classSendMessage{publicSendMessage(){do{Sendersender=SimpleFactory.createSender();//选择发送信息的⼯具if(sender==null){System.out.println("欢迎下次使⽤");break;}else{sender.sendMessage();}}while(true);}}(4)代码分析:对于上述代码,SendMessage只与⼯⼚类SimpleFactory相关联,此时需要扩展代码时,⽐如扩展QQSender,让其实现Sender并重写⽅法后,在SimpleFactory中改变相关代码即可(违反开闭原则),不需要再改动SendMessage的代码。(5)UML图:4、使⽤静态⼯⼚模式实现(常⽤形式):将上例的SimpleFactory中publicSendercreateSender()改为publicstaticSendercreateSender()。调⽤时,直接使⽤SimpleFactory.createSender()即可。publicstaticSendercreateSender(){System.out.println("输⼊发送⼯具的类型(1-3):");System.out.println("1:短信");System.out.println("2:微信");System.out.println("3:邮件");Scannerscanner=newScanner(System.in);StringsenderType=scanner.nextLine();if("1".equals(senderType)){returnnewShortMessageSender();}elseif("2".equals(senderType)){returnnewWeChatSender();}elseif("3".equals(senderType)){returnnewMailSender();}else{returnnull;}}三、⼯⼚⽅法模式1、什么是⼯⼚⽅法模式:在⼯⼚内部定义⼀个创建对象的抽象⽅法,由⼦类去确定要实例化的对象。简单的讲⼯⼚⽅法模式将对象实例化的操作推迟到实现。可以看做抽象⼯⼚模式的⼀个常见类型。2、使⽤⼯⼚模式实现:(1)定义⼀个发送⼯具的⽗类(接⼝),并将各种发送⼯具作为⼦类(实现类)。(2)定义⼀个⼯⼚⽅法接⼝,并通过⼯⼚实现类去实例化对象。(3)定义⼀个选择发送⼯具的类,⽤于调⽤⼯⼚实现类。(4)代码实现:packagecreative.pattern.factory.factoryMethod;importjava.util.Scanner;/***⼯⼚⽅法模式测试类**/publicclassfactoryMethodDemo{publicstaticvoidmain(String[]args){newSendMessage();}}/***定义⼀个发送⼯具的接⼝**/interfaceSender{voidsendMessage();}/***定义⼀个短信发送⼯具,实现接⼝,重写⽅法**/classShortMessageSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送短信");}
}}/***定义⼀个微信发送⼯具,实现接⼝,重写⽅法**/classWeChatSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送微信");}}/***定义⼀个邮件发送⼯具,实现接⼝,重写⽅法**/classMailSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("发送邮件");}}/***使⽤⼯⼚⽅法模式,让⼦类去创建对象**/interfaceFactoryMethod{SendersendMessage();}/***短信⼯⼚类,实现⼯⼚⽅法类并重写相关⽅法**/classShortMessageFactoryimplementsFactoryMethod{@OverridepublicSendersendMessage(){returnnewShortMessageSender();}}/***微信⼯⼚类,实现⼯⼚⽅法类并重写相关⽅法**/classWeChatFactoryimplementsFactoryMethod{@OverridepublicSendersendMessage(){returnnewWeChatSender();}}/***邮件⼯⼚类,实现⼯⼚⽅法类并重写相关⽅法**/classMailFactoryimplementsFactoryMethod{@Override
@OverridepublicSendersendMessage(){returnnewMailSender();}}/***定义⼀个选择发送⼯具的类*/classSendMessage{publicSendMessage(){do{System.out.println("输⼊发送⼯具的类型(1-3):");System.out.println("1:短信");System.out.println("2:微信");System.out.println("3:邮件");Scannerscanner=newScanner(System.in);StringsenderType=scanner.nextLine();if("1".equals(senderType)){FactoryMethodfactoryMethod=newShortMessageFactory();Sendersender=factoryMethod.sendMessage();//选择发送短信sender.sendMessage();}elseif("2".equals(senderType)){FactoryMethodfactoryMethod=newWeChatFactory();Sendersender=factoryMethod.sendMessage();//选择发送微信sender.sendMessage();}elseif("3".equals(senderType)){FactoryMethodfactoryMethod=newMailFactory();Sendersender=factoryMethod.sendMessage();//选择发送邮件sender.sendMessage();}else{System.out.println("欢迎下次使⽤");break;}}while(true);}}(5)代码分析:SendMessage类只与FactoryMethod有关,当扩展新的功能时,⽐如QQSender,只需创建⼀个QQFactory,实现FactoryMethod并重写其⽅法即可,调⽤时⽆需更改其他代码(必要的逻辑处理除外,符合开闭原则)。(6)UML图:
四、抽象⼯⼚模式1、什么是抽象⼯⼚模式为创建⼀组相关或相互依赖的对象提供⼀个接⼝,⽽且⽆需指定他们的具体类。注:产品族:是指位于不同产品等级结构中功能相关联的产品组成的家族。产品等级结构:可以理解为⼀个接⼝或者⼀个抽象类。2、抽象⼯⼚模式与⼯⼚⽅法模式的区别(1)抽象⼯⼚模式是⼯⼚⽅法模式的升级版,其针对的是多个产品等级结构,即抽象⼯⼚模式所提供的产品是衍⽣⾃不同的接⼝或抽象类。(2)⼯⼚⽅法模式:针对⼀个产品等级结构,即⼯⼚⽅法模式衍⽣⾃同⼀个接⼝或者抽象类。(3)如下图所⽰,ShortMessage与WeChat属于同⼀个产品等级,ShortMessage与ShortMessage2属于两个产品等级,为产品族。所以若存在两个产品等级及以上的情况,即为抽象⼯⼚模式,若是同⼀个产品等级,则为⼯⼚⽅法模式。下图为⼯⼚⽅法模式:下图为抽象⼯⼚模式:3、举例:在之前案例的基础上,增加⼀个功能,微信、短信均可以图⽚。(1)定义⼀个发送⼯具的⽗类(接⼝),并将各种发送⼯具作为⼦类(实现类)。(2)定义⼀个⼯⼚⽅法接⼝,在⽅法中对产品族进⾏约束,并通过⼯⼚实现类去实例化对象。(3)定义⼀个选择发送⼯具的类(测试类),⽤于调⽤⼯⼚实现类。(4)代码实现:packagecreative.pattern.factory.absFactory;/***抽象⼯⼚模式测试类**/publicclassAbsFactoryDemo{publicstaticvoidmain(String[]args){AbsFactoryabsFactory=newWeChatFactory();absFactory.getSender().sendMessage();absFactory.getSender2().sendMessage();((WeChatSender2)absFactory.getSender2()).sendPicture();AbsFactoryabsFactory2=newShortMessageFactory();absFactory2.getSender().sendMessage();absFactory2.getSender2().sendMessage();((ShortMessageSender2)absFactory2.getSender2()).sendPicture();}}/***定义⼀个发送⼯具的接⼝**/interfaceSender{voidsendMessage();}/***定义⼀个微信发送⼯具,实现接⼝,重写⽅法**/classWeChatSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("使⽤微信,发送短信");}}}/***定义⼀个微信发送⼯具,实现接⼝,重写⽅法,并新增⾃⼰的⽅法**/classWeChatSender2implementsSender{@OverridepublicvoidsendMessage(){System.out.println("使⽤微信,发送短信");}publicvoidsendPicture(){System.out.println("使⽤微信,发送图⽚");}}/***定义⼀个短信发送⼯具,实现接⼝,重写⽅法**/classShortMessageSenderimplementsSender{@OverridepublicvoidsendMessage(){System.out.println("使⽤短信,发送短信");}}/***定义⼀个短信发送⼯具,实现接⼝,重写⽅法,并新增⾃⼰的⽅法**/classShortMessageSender2implementsSender{@OverridepublicvoidsendMessage(){System.out.println("使⽤短信,发送短信");}publicvoidsendPicture(){System.out.println("使⽤短信,发送图⽚");}}/***抽象⼯⼚模式**/interfaceAbsFactory{SendergetSender();SendergetSender2();}/***⼯⼚⼦类,实现抽象⼯⼚类,重写相关⽅法,**/classWeChatFactoryimplementsAbsFactory{@OverridepublicSendergetSender(){returnnewWeChatSender();}
}@OverridepublicSendergetSender2(){returnnewWeChatSender2();}}/***⼯⼚⼦类,实现抽象⼯⼚类,重写相关⽅法,**/classShortMessageFactoryimplementsAbsFactory{@OverridepublicSendergetSender(){returnnewShortMessageSender();}@OverridepublicSendergetSender2(){returnnewShortMessageSender2();}}(5)代码分析:对于产品族,定义在⼀个接⼝中,然后通过不同的⼦类去实现。扩展时,只需要实现接⼝并重写相关⽅法即可,满⾜开闭原则。(6)UML图:五、JDK中⼯⼚模式举例(Calendar)1、部分源码publicabstractclassCalendarimplementsSerializable,Cloneable,Comparable<Calendar>{/***Getsacalendarusingthedefaulttimezoneandlocale.The*<code>Calendar</code>returnedisbasedonthecurrenttime*inthedefaulttimezonewiththedefault*{@linkLocale.Category#FORMATFORMAT}locale.**@returnaCalendar.*/publicstaticCalendargetInstance(){returncreateCalendar(TimeZone.getDefault(),Locale.getDefault(Locale.Category.FORMAT));}privatestaticCalendarcreateCalendar(TimeZonezone,LocaleaLocale){CalendarProviderprovider=LocaleProviderAdapter.getAdapter(CalendarProvider.class,aLocale).getCalendarProvider();if(provider!=null){try{returnprovider.getInstance(zone,aLocale);}catch(IllegalArgumentExceptioniae){//fallbacktothedefaultinstantiation}}Calendarcal=null;if(aLocale.hasExtensions()){Stringcaltype=aLocale.getUnicodeLocaleType("ca");if(caltype!=null){switch(caltype){case"buddhist":cal=newBuddhistCalendar(zone,aLocale);break;case"japanese":cal=newJapaneseImperialCalendar(zone,aLocale);break;case"gregory":cal=newGregorianCalendar(zone,aLocale);break;}}}if(cal==null){//Ifnoknowncalendartypeisexplicitlyspecified,//performthetraditionalwaytocreateaCalendar://createaBuddhistCalen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区活跃度的预算与投资合同
- 全职员工离职说明
- 数据库技术COMPUTER87课件
- 铁路市场营销集中性市场营销策略课件
- 双总线冗余供电方式卢凯霞时间年月课件
- 中医特色护理课件
- 中医关于水肿的课件
- 高空电力作业安全合同
- 养生保健品经销合同范本
- 北京市东城区2024届高三下学期一模历史试题 含解析
- 环境毒理学考试整理重点
- GH-T 1388-2022 脱水大蒜标准规范
- (完整版)软件工程导论(第六版)张海藩牟永敏课后习题答案
- 金属材料成形工艺及控制课件:轧制理论与工艺 (2)-
- 《我与集体共成长》的主题班会
- 六年级趣味数学活动课堂课件
- imo中的问题定理与方法
- 新能源汽车运用与维修专业人才培养方案
- 氨吹脱塔单元设计示例
- 中国移动-安全-L3
- GB/T 42314-2023电化学储能电站危险源辨识技术导则
评论
0/150
提交评论