收藏 分销(赏)

第十三章-工厂方法模式.ppt

上传人:精**** 文档编号:1627507 上传时间:2024-05-06 格式:PPT 页数:40 大小:211.51KB 下载积分:14 金币
下载 相关 举报
第十三章-工厂方法模式.ppt_第1页
第1页 / 共40页
第十三章-工厂方法模式.ppt_第2页
第2页 / 共40页


点击查看更多>>
资源描述
第十三章第十三章 工厂方法模式工厂方法模式 2024/5/3 周五1工厂方法模式(别名:虚拟构造)工厂方法模式(别名:虚拟构造)定定义义一一个个用用于于创创建建对对象象的的接接口口,让让子子类类决决定定实实例例化化哪哪一一个类。个类。Factory Method使一个类的实例化延迟到其子类。使一个类的实例化延迟到其子类。Mediator Pattern(Another Name:Virtual Constructor)Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在Factory Method模式中,子类(在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。一一、概述概述 2024/5/3 周五3 当系统准备为用户提供某个类的子类的实例,当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。方法返回某个子类的实例。二、二、工厂方法模式的结构与使用工厂方法模式的结构与使用2024/5/3 周五4模式的结构中包括四种角色:模式的结构中包括四种角色:抽象产品(抽象产品(ProductProduct)具体产品(具体产品(ConcreteProductConcreteProduct)构造者(构造者(CreatorCreator)具体构造者(具体构造者(ConcreteCreatorConcreteCreator)2024/5/3 周五5模式的模式的UMLUML类图类图 模式的结构的描述与使用模式的结构的描述与使用有一个PenCore类(笔芯),该类是一个抽象类。假设PenCore类有三个子类,分别是RedPenCore、BluePenCore和BlackPenCore,而系统设计的目的是为用户提供BallPen类(圆珠笔)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用BallPen类的子类的实例来得到PenCore类的子类的实例。2024/5/3 周五7模式的结构的描述与使用模式的结构的描述与使用 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 abstract void writeWord(String s);2024/5/3 周五8模式的结构的描述与使用模式的结构的描述与使用 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 writeWord(String s)System.out.println(System.out.println(写出写出+color+color+的字的字:+s);:+s);2024/5/3 周五9模式的结构的描述与使用模式的结构的描述与使用 2 2具体产品(具体产品(ConcreteProductConcreteProduct)_2:_2:BluePenCore.java BluePenCore.java public class BluePenCore extends PenCorepublic class BluePenCore extends PenCore BluePenCore()BluePenCore()color=color=蓝色蓝色;public void writeWord(String s)public void writeWord(String s)System.out.println(System.out.println(写出写出+color+color+的字的字:+s);:+s);2024/5/3 周五10模式的结构的描述与使用模式的结构的描述与使用 2 2具体产品(具体产品(ConcreteProductConcreteProduct)_3:_3:BlackPenCore.java BlackPenCore.java public class BlackPenCore extends PenCorepublic 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);2024/5/3 周五11模式的结构的描述与使用模式的结构的描述与使用 3 3构造者(构造者(CreatorCreator):BallPen.java BallPen.java public abstract 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();/工厂方法工厂方法 2024/5/3 周五124 4具体构造者(具体构造者(ConcreteCreatorConcreteCreator):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 BlueBallPen extends BallPen public PenCore getPenCore()public PenCore getPenCore()return new BluePenCore();return new BluePenCore();BlackBallPen.javapublicclassBlackBallPenextendsBallPenpublicPenCoregetPenCore()returnnewBlackPenCore();2024/5/3 周五14模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.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.writeWord(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=ballPen.getPenCore();penCore.writeWord(nice to meet you);penCore.writeWord(nice to meet you);三、三、工厂方法模式的优点工厂方法模式的优点 2024/5/3 周五15使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。四、适合使用工厂方法的情景用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。五、应用举例创建药品对象系统目前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类规定了所创建的药品必须给出药品的成分及其含量。Drug目前有两个子类:Paracetamol和Amorolfine。Paracetamol负责创建氨加黄敏一类的药品,Amorolfine负责创建盐酸阿莫罗芬一类的药品。一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。/Drug.javapublic abstract class Drug String constitute;String name;public String getName()return name;public String getConstitute()return constitute;/Paracetamol.javapublic class Paracetamol extends Drug String part1=每粒含乙酰氨基酚;String part2=每粒含咖啡因;String part3=每粒含人工牛黄;String part4=每粒含马来酸氯苯;public Paracetamol(String name,int a)this.name=name;part1=part1+:+a0+毫克n;part2=part2+:+a1+毫克n;part3=part3+:+a2+毫克n;part4=part4+:+a3+毫克n;constitute=part1+part2+part3+part4;/Amorolfine.javapublic class Amorolfine extends Drug String part1=每粒含甲硝唑;String part2=每粒含人工牛黄;public Amorolfine(String name,int a)this.name=name;part1=part1+:+a0+毫克n;part2=part2+:+a1+毫克n;constitute=part1+part2;/DrugCreator.javapublic interface DrugCreator public abstract Drug getDrug();/ParaDrugCreator.javapublic class ParaDrugCreator implements DrugCreator public Drug getDrug()int a=250,15,1,10;Drug drug=new Paracetamol(氨加黄敏胶囊,a);return drug;/AmorDrugCreator.javapublic class AmorDrugCreator implements DrugCreator public Drug getDrug()int a=200,5;Drug drug=new Amorolfine(甲硝矬胶囊,a);return drug;/Application.javaimport java.util.*;public class Application public static void main(String args)DrugCreator creator=new ParaDrugCreator();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();六、应用举例记录日志public interface Trace /turn on and off 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);public class FileTrace implements Trace private java.io.PrintWriter pw;private boolean debug;public FileTrace()throws java.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 pw.println(ERROR:+message);pw.flush();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 message)/always print out errors System.out.println(ERROR:+message);SystemTrace log=new SystemTrace();/.code.log.debug(entering loog);/.etc.public class TraceFactory public static Trace getTrace()return new SystemTrace();/.some code.Trace log=new TraceFactory.getTrace();/.code.log.debug(entering loog);/.etc.七、应用举例自动车工厂有一系列的自动车产品Bus(公交车),Truck(卡车);它们需要由不同的工厂生产,但具有相同的生产流程。为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案来实现自动车生产的过程。设计目标一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可以让整个系统具有灵活的可扩展性,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。实现方法一abstractclassCarFactory/定义生产自动车生产的接口规范定义生产自动车生产的接口规范publicCarcreateCar();classBusFactoryextendsCarFactorypublicCarcreateCar()/生产公交车生产公交车returnnewCarBus();classTruckFactoryextendsCarFactorypublicCarcreateCar()/生产卡车生产卡车returnnewTruckBus();publicclassCarpublicStringgetType()returnCar;publicclassCarBusextendsCarpublicStringgetType()returnBus;publicclassCarTruckextendsCarpublicStringgetType()returnTruck;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();/生产卡车 Car truck=factory.createCar();System.out.println(生产了:+truck.getType();实现方法二classCarFactorypublicCarcreateCar(StringcarType)if(carType.equals(“BUS”)ReturnnewCarBus();if(carType.equals(“TRUCK”)ReturnnewCarTruck();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();
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服