《软件体系结构与设计模式 工厂方法模式.pptx》由会员分享,可在线阅读,更多相关《软件体系结构与设计模式 工厂方法模式.pptx(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在Factory Method模式中,子类(在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。第1页/共40页一、概述 2023/2/192 当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。第2页/共40页二、工厂方法模式的结构与使
2、用2023/2/193模式的结构中包括四种角色:模式的结构中包括四种角色:抽象产品(抽象产品(ProductProduct)具体产品(具体产品(ConcreteProductConcreteProduct)构造者(构造者(CreatorCreator)具体构造者(具体构造者(ConcreteCreatorConcreteCreator)第3页/共40页2023/2/194模式的UMLUML类图 第4页/共40页模式的结构的描述与使用有一个PenCore类(笔芯),该类是一个抽象类。假设PenCore类有三个子类,分别是RedPenCore、BluePenCore和BlackPenCore,而系
3、统设计的目的是为用户提供BallPen类(圆珠笔)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用BallPen类的子类的实例来得到PenCore类的子类的实例。第5页/共40页2023/2/196模式的结构的描述与使用 1 1抽象产品(ProductProduct):PenCore.java PenCore.java public abstract class PenCorepublic abstract class PenCore String color;String color;public abstract void writeWord(String s);public a
4、bstract void writeWord(String s);第6页/共40页2023/2/197模式的结构的描述与使用 2 2具体产品(ConcreteProductConcreteProduct)_1:_1:RedPenCore.java RedPenCore.java public class RedPenCore extends PenCorepublic class RedPenCore extends PenCore RedPenCore()RedPenCore()color=color=红色;public void writeWord(String s)public void
5、 writeWord(String s)System.out.println(System.out.println(写出+color+color+的字:+s);:+s);第7页/共40页2023/2/198模式的结构的描述与使用 2 2具体产品(ConcreteProductConcreteProduct)_2:_2:BluePenCore.java BluePenCore.java public class BluePenCore extends PenCorepublic class BluePenCore extends PenCore BluePenCore()BluePenCore(
6、)color=color=蓝色;public void writeWord(String s)public void writeWord(String s)System.out.println(System.out.println(写出+color+color+的字:+s);:+s);第8页/共40页2023/2/199模式的结构的描述与使用 2 2具体产品(ConcreteProductConcreteProduct)_3:_3:BlackPenCore.java BlackPenCore.java public class BlackPenCore extends PenCorepubli
7、c class BlackPenCore extends PenCore BlackPenCore()BlackPenCore()color=color=黑色;public void writeWord(String s)public void writeWord(String s)System.out.println(System.out.println(写出+color+color+的字:+s);:+s);第9页/共40页2023/2/1910模式的结构的描述与使用 3 3构造者(CreatorCreator):BallPen.java BallPen.java public abstra
8、ct class BallPenpublic abstract class BallPen BallPen()BallPen()System.out.println(System.out.println(生产了一只装有+getPenCore().color+getPenCore().color+笔芯的圆珠笔););public abstract PenCore getPenCore();/public abstract PenCore getPenCore();/工厂方法 第10页/共40页2023/2/19114 4具体构造者(ConcreteCreatorConcreteCreator):
9、RedBallPen.javaRedBallPen.javapublic class RedBallPen extends BallPenpublic class RedBallPen extends BallPen public PenCore getPenCore()public PenCore getPenCore()return new RedPenCore();return new RedPenCore();BlueBallPen.javaBlueBallPen.javapublic class BlueBallPen extends BallPenpublic class Blue
10、BallPen extends BallPen public PenCore getPenCore()public PenCore getPenCore()return new BluePenCore();return new BluePenCore();第11页/共40页BlackBallPen.javapublicclassBlackBallPenextendsBallPenpublicPenCoregetPenCore()returnnewBlackPenCore();第12页/共40页2023/2/1913模式的结构的描述与使用 5 5应用 Application.javaApplic
11、ation.java public class Applicationpublic class Application public static void main(String args)public static void main(String args)PenCore penCore;PenCore penCore;BallPen ballPen=new BlueBallPen();BallPen ballPen=new BlueBallPen();penCore=ballPen.getPenCore();penCore=ballPen.getPenCore();penCore.wr
12、iteWord(penCore.writeWord(你好,很高兴认识你););ballPen=new RedBallPen();ballPen=new RedBallPen();penCore=ballPen.getPenCore();penCore=ballPen.getPenCore();penCore.writeWord(How are you);penCore.writeWord(How are you);ballPen=new BlackBallPen();ballPen=new BlackBallPen();penCore=ballPen.getPenCore();penCore=
13、ballPen.getPenCore();penCore.writeWord(nice to meet you);penCore.writeWord(nice to meet you);第13页/共40页三、工厂方法模式的优点 2023/2/1914使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。第14页/共40页四、适合使用工厂方法的情景用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。第15页/共40页五、应用举例创建药品对象系统目
14、前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类规定了所创建的药品必须给出药品的成分及其含量。Drug目前有两个子类:Paracetamol和Amorolfine。Paracetamol负责创建氨加黄敏一类的药品,Amorolfine负责创建盐酸阿莫罗芬一类的药品。一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。第16页/共40页/Drug.javapublic abstract class Drug String consti
15、tute;String name;public String getName()return name;public String getConstitute()return constitute;第17页/共40页/Paracetamol.javapublic class Paracetamol extends Drug String part1=每粒含乙酰氨基酚;String part2=每粒含咖啡因;String part3=每粒含人工牛黄;String part4=每粒含马来酸氯苯;public Paracetamol(String name,int a)this.name=name;
16、part1=part1+:+a0+毫克n;part2=part2+:+a1+毫克n;part3=part3+:+a2+毫克n;part4=part4+:+a3+毫克n;constitute=part1+part2+part3+part4;第18页/共40页/Amorolfine.javapublic class Amorolfine extends Drug String part1=每粒含甲硝唑;String part2=每粒含人工牛黄;public Amorolfine(String name,int a)this.name=name;part1=part1+:+a0+毫克n;part2=
17、part2+:+a1+毫克n;constitute=part1+part2;第19页/共40页/DrugCreator.javapublic interface DrugCreator public abstract Drug getDrug();第20页/共40页/ParaDrugCreator.javapublic class ParaDrugCreator implements DrugCreator public Drug getDrug()int a=250,15,1,10;Drug drug=new Paracetamol(氨加黄敏胶囊,a);return drug;第21页/共4
18、0页/AmorDrugCreator.javapublic class AmorDrugCreator implements DrugCreator public Drug getDrug()int a=200,5;Drug drug=new Amorolfine(甲硝矬胶囊,a);return drug;第22页/共40页/Application.javaimport java.util.*;public class Application public static void main(String args)DrugCreator creator=new ParaDrugCreator(
19、);Drug drug=creator.getDrug();System.out.println(drug.getName()+的成份:);System.out.println(drug.getConstitute();creator=new AmorDrugCreator();drug=creator.getDrug();System.out.println(drug.getName()+的成份:);System.out.println(drug.getConstitute();第23页/共40页六、应用举例记录日志public interface Trace /turn on and of
20、f debugging public void setDebug(boolean debug);/write out a debug message public void debug(String message);/write out an error message public void error(String message);第24页/共40页public class FileTrace implements Trace private java.io.PrintWriter pw;private boolean debug;public FileTrace()throws ja
21、va.io.IOException pw=new java.io.PrintWriter(new java.io.FileWriter(c:trace.log);public void setDebug(boolean debug)this.debug=debug;public void debug(String message)if(debug)/only print if debug is true pw.println(DEBUG:+message);pw.flush();public void error(String message)/always print out errors
22、pw.println(ERROR:+message);pw.flush();第25页/共40页public class SystemTrace implements Trace private boolean debug;public void setDebug(boolean debug)this.debug=debug;public void debug(String message)if(debug)/only print if debug is true System.out.println(DEBUG:+message);public void error(String messag
23、e)/always print out errors System.out.println(ERROR:+message);第26页/共40页SystemTrace log=new SystemTrace();/.code.log.debug(entering loog);/.etc.第27页/共40页public class TraceFactory public static Trace getTrace()return new SystemTrace();/.some code.Trace log=new TraceFactory.getTrace();/.code.log.debug(
24、entering loog);/.etc.第28页/共40页七、应用举例自动车工厂有一系列的自动车产品Bus(公交车),Truck(卡车);它们需要由不同的工厂生产,但具有相同的生产流程。为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案来实现自动车生产的过程。第29页/共40页设计目标一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可以让整个系统具有灵活的可扩展性,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。第30页/共40页实现方法一abstractclassCarFactory/定
25、义生产自动车生产的接口规范publicCarcreateCar();第31页/共40页classBusFactoryextendsCarFactorypublicCarcreateCar()/生产公交车returnnewCarBus();第32页/共40页classTruckFactoryextendsCarFactorypublicCarcreateCar()/生产卡车returnnewTruckBus();第33页/共40页publicclassCarpublicStringgetType()returnCar;第34页/共40页publicclassCarBusextendsCarpub
26、licStringgetType()returnBus;第35页/共40页publicclassCarTruckextendsCarpublicStringgetType()returnTruck;第36页/共40页public class Client public static void main(String args)CarFactory factory=new BusFactory();/生产公交车 Car bus=factory.createCar();System.out.println(生产了:+bus.getType();factory=new TruckFactory();
27、/生产卡车 Car truck=factory.createCar();System.out.println(生产了:+truck.getType();第37页/共40页实现方法二classCarFactorypublicCarcreateCar(StringcarType)if(carType.equals(“BUS”)ReturnnewCarBus();if(carType.equals(“TRUCK”)ReturnnewCarTruck();第38页/共40页public class Client public static void main(String args)CarFactory factory=new CarFactory();/生产公交车 Car bus=factory.createCar(“BUS”);System.out.println(生产了:+bus.getType();/生产卡车 Car truck=factory.createCar(“TRUCK”);System.out.println(生产了:+truck.getType();第39页/共40页感谢您的观看!第40页/共40页