




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十三章 工厂方法模式,2020/8/12,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 su
2、bclasses.,在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在Factory Method模式中,子类 (在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。,一 、 概述,2020/8/12,3,当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。,二、工厂方法模式的结构与使
3、用,2020/8/12,4,模式的结构中包括四种角色: 抽象产品(Product) 具体产品(ConcreteProduct) 构造者(Creator) 具体构造者(ConcreteCreator),2020/8/12,5,模式的UML类图,模式的结构的描述与使用,有一个PenCore类(笔芯),该类是一个抽象类。假设PenCore类有三个子类,分别是RedPenCore、BluePenCore和BlackPenCore,而系统设计的目的是为用户提供BallPen类(圆珠笔)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用BallPen类的子类的实例来得到PenCore类的子类的实例
4、。,2020/8/12,7,模式的结构的描述与使用,1抽象产品(Product) : PenCore.java public abstract class PenCore String color; public abstract void writeWord(String s); ,2020/8/12,8,模式的结构的描述与使用,2具体产品(ConcreteProduct)_1 : RedPenCore.java public class RedPenCore extends PenCore RedPenCore() color=红色; public void writeWord(Strin
5、g s) System.out.println(写出+color+的字:+s); ,2020/8/12,9,模式的结构的描述与使用,2具体产品(ConcreteProduct)_2 : BluePenCore.java public class BluePenCore extends PenCore BluePenCore() color=蓝色; public void writeWord(String s) System.out.println(写出+color+的字:+s); ,2020/8/12,10,模式的结构的描述与使用,2具体产品(ConcreteProduct)_3: Black
6、PenCore.java public class BlackPenCore extends PenCore BlackPenCore() color=黑色; public void writeWord(String s) System.out.println(写出+color+的字:+s); ,2020/8/12,11,模式的结构的描述与使用,3构造者(Creator):BallPen.java public abstract class BallPen BallPen() System.out.println(生产了一只装有+getPenCore().color+笔芯的圆珠笔); publ
7、ic abstract PenCore getPenCore(); /工厂方法 ,2020/8/12,12,4具体构造者(ConcreteCreator): RedBallPen.java public class RedBallPen extends BallPen public PenCore getPenCore() return new RedPenCore(); BlueBallPen.java public class BlueBallPen extends BallPen public PenCore getPenCore() return new BluePenCore();
8、,BlackBallPen.java public class BlackBallPen extends BallPen public PenCore getPenCore() return new BlackPenCore(); ,2020/8/12,14,模式的结构的描述与使用,5应用 Application.java public class Application public static void main(String args) PenCore penCore; BallPen ballPen=new BlueBallPen(); penCore=ballPen.getPenC
9、ore(); penCore.writeWord(你好,很高兴认识你); ballPen=new RedBallPen(); penCore=ballPen.getPenCore(); penCore.writeWord(How are you); ballPen=new BlackBallPen(); penCore=ballPen.getPenCore(); penCore.writeWord(nice to meet you); ,三、工厂方法模式的优点,2020/8/12,15,使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。 工厂方法使用户不必知道它所使用的对象是怎样被创建
10、的,只需知道该对象有哪些方法即可。,四、适合使用工厂方法的情景,用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。,五、应用举例创建药品对象,系统目前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类规定了所创建的药品必须给出药品的成分及其含量。Drug目前有两个子类:Paracetamol和Amorolfine。 Paracetamol负责创建氨加黄敏一类的药品,Amorolfine负责创建盐酸阿莫罗芬一类的药品。 一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用
11、Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。,/ Drug.java public abstract class Drug String constitute; String name; public String getName() return name; public String getConstitute() return constitute; ,/ Paracetamol.java public class Paracetamol extends Drug String part1=每粒含乙酰氨基酚; String pa
12、rt2=每粒含咖啡因; String part3=每粒含人工牛黄; String part4=每粒含马来酸氯苯; public Paracetamol(String name,int a) =name; part1=part1+:+a0+毫克n; part2=part2+:+a1+毫克n; part3=part3+:+a2+毫克n; part4=part4+:+a3+毫克n; constitute=part1+part2+part3+part4; ,/ Amorolfine.java public class Amorolfine extends Drug String pa
13、rt1=每粒含甲硝唑; String part2=每粒含人工牛黄; public Amorolfine(String name,int a) =name; part1=part1+:+a0+毫克n; part2=part2+:+a1+毫克n; constitute=part1+part2; ,/ DrugCreator.java public interface DrugCreator public abstract Drug getDrug(); ,/ ParaDrugCreator .java public class ParaDrugCreator implements
14、 DrugCreator public Drug getDrug() int a=250,15,1,10; Drug drug=new Paracetamol(氨加黄敏胶囊,a); return drug; ,/ AmorDrugCreator .java public class AmorDrugCreator implements DrugCreator public Drug getDrug() int a=200,5; Drug drug=new Amorolfine(甲硝矬胶囊,a); return drug; ,/ Application.java import java.util
15、.*; 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.g
16、etName()+的成份:); 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 cl
17、ass 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(
18、 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.de
19、bug = 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
20、 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(卡车);它们需要由不同的工厂生产,但具有相同的生产流程。为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案
21、来实现自动车生产的过程。,设计目标,一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程; 另一方面,可以让整个系统具有灵活的可扩展性,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。,实现方法一,abstract class CarFactory /定义生产自动车生产的接口规范 public CarcreateCar(); ,class BusFactory extends CarFactory public CarcreateCar() /生产公交车 return new CarBus(); ,class TruckFactory extends CarFactory public CarcreateCar() /生产卡车 return new TruckBus(); ,public class Car public StringgetType() return Car ; ,public class CarBus extends Car public StringgetType() return Bus ; ,public class CarTruck extends Car public StringgetType() r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 流动科技馆观后感范文
- 海洋增材制造产业发展概述
- 海洋航道建设与维护
- 老年护理介绍课件教学
- 拆除工程合同履约及终止合同
- 夫妻离婚后彩礼返还及财产分割协议
- 材料物理晶体物理物理物理物理物理物理电化学合同
- 边疆古代民族舞蹈考古合同
- 餐饮行业拆伙退伙协议书(财务清算)
- 牛场租赁与绿色养殖技术支持合同
- 2024-2025学年度天津铁道职业技术学院单招《语文》真题附答案详解(突破训练)
- 快递行业市场发展分析及投资前景研究报告2025-2028版
- 2025年育婴师职业资格考试试题及答案
- 2023年三种人试题附答案
- 北京市八十中学2025届八年级英语第二学期期中经典试题含答案
- 2024年 金泽镇专职村务工作者招录考试真题试题含答案
- 哇哈哈品牌管理制度
- 《基本乐理》师范与学前教育专业基本乐理相关知识全套教学课件
- 2025年内蒙古自治区包头市东河区第二中学英语八年级第二学期期末复习检测模拟试题含答案
- 2025年安徽省中考物理试题(原卷版)
- 2025年四川省达州市中考英语真题(原卷版)
评论
0/150
提交评论