




kok电子竞技权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
kok电子竞技:文档简介
第十三章工厂方法模式2/4/20251工厂方法模式(别名:虚拟构造)定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。MediatorPattern(AnotherName:VirtualConstructor)
Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在FactoryMethod模式中,子类(在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。一、概述2/4/20253当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。二、工厂方法模式的结构与使用2/4/20254模式的结构中包括四种角色:抽象产品(Product)具体产品(ConcreteProduct)构造者(Creator)具体构造者(ConcreteCreator)2/4/20255模式的UML类图
模式的结构的描述与使用有一个PenCore类(笔芯),该类是一个抽象类。假设PenCore类有三个子类,分别是RedPenCore、BluePenCore和BlackPenCore,而系统设计的目的是为用户提供BallPen类(圆珠笔)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用BallPen类的子类的实例来得到PenCore类的子类的实例。2/4/20257模式的结构的描述与使用1.抽象产品(Product)
:PenCore.javapublicabstractclassPenCore{Stringcolor;publicabstractvoidwriteWord(Strings);}2/4/20258模式的结构的描述与使用2.具体产品(ConcreteProduct)_1:RedPenCore.javapublicclassRedPenCoreextendsPenCore{RedPenCore(){color="红色";}publicvoidwriteWord(Strings){System.out.println("写出"+color+"的字:"+s);}}2/4/20259模式的结构的描述与使用2.具体产品(ConcreteProduct)_2:BluePenCore.javapublicclassBluePenCoreextendsPenCore{BluePenCore(){color="蓝色";}publicvoidwriteWord(Strings){System.out.println("写出"+color+"的字:"+s);}}2/4/202510模式的结构的描述与使用2.具体产品(ConcreteProduct)_3:BlackPenCore.javapublicclassBlackPenCoreextendsPenCore{BlackPenCore(){color="黑色";}publicvoidwriteWord(Strings){System.out.println("写出"+color+"的字:"+s);}}2/4/202511模式的结构的描述与使用3.构造者(Creator):BallPen.javapublicabstractclassBallPen{BallPen(){System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");}publicabstractPenCoregetPenCore();//工厂方法}2/4/2025124.具体构造者(ConcreteCreator):RedBallPen.javapublicclassRedBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewRedPenCore();}}BlueBallPen.javapublicclassBlueBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBluePenCore();}}BlackBallPen.javapublicclassBlackBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBlackPenCore();}}2/4/202514模式的结构的描述与使用5.应用Application.java
publicclassApplication{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");}}三、工厂方法模式的优点2/4/202515使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。四、适合使用工厂方法的情景用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。五、应用举例—创建药品对象系统目前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类规定了所创建的药品必须给出药品的成分及其含量。Drug目前有两个子类:Paracetamol和Amorolfine。Paracetamol负责创建氨加黄敏一类的药品,Amorolfine负责创建盐酸阿莫罗芬一类的药品。一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。//Drug.javapublicabstractclassDrug{Stringconstitute;Stringname;publicStringgetName(){returnname;}publicStringgetConstitute(){returnconstitute;}}//Paracetamol.javapublicclassParacetamolextendsDrug{Stringpart1="每:阴0被";Stringpart2="每:Х纫";Stringpart3="每:斯づ;";Stringpart4="每:砝此崧缺";publicParacetamol(Stringname,int[]a){=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){=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{privatebooleandebug;publicvoidsetDebug(booleandebug){this.debug=debug;}publicvoiddebug(Stringmessage){if(debug){//onlyprintifdebugistrueSystem.out.println("DEBUG:"+message);}}publicvoiderror(Stringmessage){//alwaysprintouterrorsSystem.out.println("ERROR:"+message);}}SystemTracelog=newSystemTrace();//...code...log.debug("enteringloog");//...etc...publicclassTraceFactory{publicstaticTracegetTrace(){returnnewSystemTrace();}}//...somecode...Tracelog=newTraceFactory.getTrace();//...code...log.debug("enteringloog");//...etc...七、应用举例—自动车工厂有一系列的自动车产品Bus(公交车),Truck(卡车);
它们需要由不同的工厂生产,但具有相同的生产流程。
为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案来实现自动车生产的过程。
设计目标一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可以让整个系统具有灵活的可扩展性,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。实现方法一abstract
class
CarFactory
{
//定义生产自动车生产的接口规范
public
Car
createCar();
}
class
BusFactory
extends
CarFactory
{
public
Car
createCar()
{
//生产公交车
return
new
CarBus();
}
}
class
TruckFactory
extends
CarFactory
{
public
Car
createCar()
{
//生产卡车
return
new
TruckBus();
}
}
public
class
Car
{
public
String
getType()
{
return
"Car";
}
}
public
class
CarBus
extends
Car
{
public
String
getType()
{
return
"Bus";
}
}
public
class
CarTruck
extends
Car
{
public
String
getType()
{
return
"Truck";
}
}
publicclassClient{publicstaticvoidmain(String[]args){CarFactoryfactory=newBusFactory();//生产公交车Carbus=factory.createCar();System.out.println("生产了:"+bus.getType());
factory=newTruckFactory();//生产卡车Cartruck=factory.createCar();System.out.println("生产了:"+truck.getType());}}实现方法二class
CarFactory
{
public
Car
createCar(StringcarType){
if(carType.equals(“BUS”))ReturnnewCarBus(); if(carType.equals(“TRUCK”))ReturnnewCarTruck();}}
publicclassClient{publicstaticvoidmain(String[]args){CarFactoryfactory=newCarFactory();//生产公交车Carbus=factory.createCar(“BUS”);System.out.println("生产了:"+bus.getType());
//生产卡车Cartruck=factory.createCar(“TRUCK”);System.out.println("生产了:"+truck.getType());}}9、春去春又回,新桃换旧符。在那桃花盛开的地方,在这醉人芬芳的季节,愿你生活像春天一样阳光,心情像桃花一样美丽,日子像桃子一样甜蜜。2月-252月-25Tuesday,February4,202510、人的志向通:退堑哪芰Τ烧壤。20:07:2420:07:2420:072/4/20258:07:24PM11、夫学须志也,才须学也,非学无以广才,非志无以成学。2月-2520:07:2420:07Feb-2504-Feb-2512、越是无能的人,越喜欢挑剔别人的错儿。20:07:2420:07:2420:07Tuesday,February4,202513、志不立,天下无可成之事。2月-252月-2520:07:2420:07:24February4,202514、ThankyouverymuchfortakingmewithyouonthatsplendidoutingtoLondon.ItwasthefirsttimethatIhadseentheToweroranyoftheotherfamoussights.IfI'dgonealone,Icouldn'thaveseennearlyasmuch,becauseIwouldn'thaveknownmywayabout.。04二月20258:07:24下午20:07:242月-2515、会当凌绝顶,一览众山小。二月258:07下午2月-2520:07February4,202516、如果一个人不知道他要驶向哪头,那么任何风都不是顺风。2025/2/420:07:2420:07:2404February202517、一个人如果不到最高峰,他就没有片刻的安宁,他也就不会感到生命的恬静和光荣。8:07:24下午8:07下午20:07:242月-25谢谢观看THEEND
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
kok电子竞技:最新文档
- 2025-2030年带底座小圆脚项目投资价值分析kok电子竞技
- 钢铁行业循环经济
- 部门综合管理人员工作
- 2025年溶解性总固体试题及答案
- 日语各类考试题型及答案
- 高效电暖风扇行业跨境出海战略研究kok电子竞技
- 创意摄影棚搭建与运营企业制定与实施新质生产力战略研究kok电子竞技
- 高仿真花卉与绿植套装企业制定与实施新质生产力战略研究kok电子竞技
- 高效电烤箱烘焙机行业深度调研及发展战略咨询kok电子竞技
- 高效防水户外地埋灯企业制定与实施新质生产力战略研究kok电子竞技
- 外包施工单位入厂安全培训(通用)课件
- 2023年全国甲卷作文真题导写-2024年高考语文一轮复习作文备考特辑(全国通用)
- 毕业设计(论文)-基于PLC的供水控制系统设计
- 金税四期下的税务风险与防范
- 《衣品修炼手册 穿出理想的自己》读书笔记思维导图PPT模板下载
- 《影子的形成》(课件)四kok电子竞技下册科学大象kok电子竞技
- DB44T 887-2011住宅小区物业管理服务规范
- GB/T 41953-2022色漆和清漆涂料中水分含量的测定气相色谱法
- 2023年河南省对口升学考试计算机专业真题及答案
- LY/T 2697-2016马尾松抚育经营技术规程
- GB/T 8005.3-2008铝及铝合金术语第3部分:表面处理
评论
0/150
提交评论