软件体系结构与设计模式 第十二章 工厂方法模式

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

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

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

资源描述

第十三章工厂方法模式2019/8/241工厂方法模式(别名:虚拟构造)定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。MediatorPattern(AnotherName:VirtualConstructor)Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.•在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在FactoryMethod模式中,子类(在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。一、概述2019/8/243当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。二、工厂方法模式的结构与使用2019/8/244模式的结构中包括四种角色:•抽象产品(Product)•具体产品(ConcreteProduct)•构造者(Creator)•具体构造者(ConcreteCreator)2019/8/245模式的UML类图模式的结构的描述与使用•有一个PenCore类(笔芯),该类是一个抽象类。假设PenCore类有三个子类,分别是RedPenCore、BluePenCore和BlackPenCore,而系统设计的目的是为用户提供BallPen类(圆珠笔)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用BallPen类的子类的实例来得到PenCore类的子类的实例。2019/8/247模式的结构的描述与使用1.抽象产品(Product):PenCore.javapublicabstractclassPenCore{Stringcolor;publicabstractvoidwriteWord(Strings);}2019/8/248模式的结构的描述与使用2.具体产品(ConcreteProduct)_1:RedPenCore.javapublicclassRedPenCoreextendsPenCore{RedPenCore(){color=红色;}publicvoidwriteWord(Strings){System.out.println(写出+color+的字:+s);}}2019/8/249模式的结构的描述与使用2.具体产品(ConcreteProduct)_2:BluePenCore.javapublicclassBluePenCoreextendsPenCore{BluePenCore(){color=蓝色;}publicvoidwriteWord(Strings){System.out.println(写出+color+的字:+s);}}2019/8/2410模式的结构的描述与使用2.具体产品(ConcreteProduct)_3:BlackPenCore.javapublicclassBlackPenCoreextendsPenCore{BlackPenCore(){color=黑色;}publicvoidwriteWord(Strings){System.out.println(写出+color+的字:+s);}}2019/8/2411模式的结构的描述与使用3.构造者(Creator):BallPen.javapublicabstractclassBallPen{BallPen(){System.out.println(生产了一只装有+getPenCore().color+笔芯的圆珠笔);}publicabstractPenCoregetPenCore();//工厂方法}2019/8/24124.具体构造者(ConcreteCreator):RedBallPen.javapublicclassRedBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewRedPenCore();}}BlueBallPen.javapublicclassBlueBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBluePenCore();}}BlackBallPen.javapublicclassBlackBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBlackPenCore();}}2019/8/2414模式的结构的描述与使用5.应用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){PenCorepenCore;BallPenballPen=newBlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord(你好,很高兴认识你);ballPen=newRedBallPen();penCore=ballPen.getPenCore();penCore.writeWord(Howareyou);ballPen=newBlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord(nicetomeetyou);}}三、工厂方法模式的优点2019/8/2415•使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。•工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。四、适合使用工厂方法的情景•用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。•用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。五、应用举例—创建药品对象•系统目前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类规定了所创建的药品必须给出药品的成分及其含量。Drug目前有两个子类:Paracetamol和Amorolfine。Paracetamol负责创建氨加黄敏一类的药品,Amorolfine负责创建盐酸阿莫罗芬一类的药品。•一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。//Drug.javapublicabstractclassDrug{Stringconstitute;Stringname;publicStringgetName(){returnname;}publicStringgetConstitute(){returnconstitute;}}//Paracetamol.javapublicclassParacetamolextendsDrug{Stringpart1=每粒含乙酰氨基酚;Stringpart2=每粒含咖啡因;Stringpart3=每粒含人工牛黄;Stringpart4=每粒含马来酸氯苯;publicParacetamol(Stringname,int[]a){this.name=name;part1=part1+:+a[0]+毫克\n;part2=part2+:+a[1]+毫克\n;part3=part3+:+a[2]+毫克\n;part4=part4+:+a[3]+毫克\n;constitute=part1+part2+part3+part4;}}//Amorolfine.javapublicclassAmorolfineextendsDrug{Stringpart1=每粒含甲硝唑;Stringpart2=每粒含人工牛黄;publicAmorolfine(Stringname,int[]a){this.name=name;part1=part1+:+a[0]+毫克\n;part2=part2+:+a[1]+毫克\n;constitute=part1+part2;}}//DrugCreator.javapublicinterfaceDrugCreator{publicabstractDruggetDrug();}//ParaDrugCreator.javapublicclassParaDrugCreatorimplementsDrugCreator{publicDruggetDrug(){int[]a={250,15,1,10};Drugdrug=newParacetamol(氨加黄敏胶囊,a);returndrug;}}//AmorDrugCreator.javapublicclassAmorDrugCreatorimplementsDrugCreator{publicDruggetDrug(){int[]a={200,5};Drugdrug=newAmorolfine(甲硝矬胶囊,a);returndrug;}}//Application.javaimportjava.util.*;publicclassApplication{publicstaticvoidmain(Stringargs[]){DrugCreatorcreator=newParaDrugCreator();Drugdrug=creator.getDrug();System.out.println(drug.getName()+的成份:);System.out.println(drug.getConstitute());creator=newAmorDrugCreator();drug=creator.getDrug();System.out.println(drug.getName()+的成份:);System.out.println(drug.getConstitute());}}六、应用举例—记录日志publicinterfaceTrace{//turnonandoffdebuggingpublicvoidsetDebug(booleandebug);//writeoutadebugmessagepublicvoiddebug(Stringmessage);//writeoutanerrormessagepublicvoiderror(Stringmessage);}publicclassFileTraceimplementsTrace{privatejava.io.PrintWriterpw;privatebooleandebug;publicFileTrace()throwsjava.io.IOException{pw=newjava.io.PrintWriter(newjava.io.FileWriter(c:\trace.log));}publicvoidsetDebug(booleandebug){this.debug=debug;}publicvoiddebug(Stringmessage){if(debug){//onlyprintifdebugistruepw.println(DEBUG:+message);pw.flush();}}publicvoiderror(Stringmessage){//alwaysprintouterrorspw.println(ERROR:+message);pw.flush();}}publicclassSystemTraceimplementsTrace{privateb

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

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

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

×
保存成功