ImageVerifierCode 换一换
格式:PPT , 页数:50 ,大小:1.16MB ,
资源ID:13363815      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13363815.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(java工厂设计模式课件.ppt)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

java工厂设计模式课件.ppt

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,The Factory,Pattern,(工厂模式),学习问题,随着经济的全球化,一个软件可能要在全球销售。因此,我们设计的软件应该能够通过简单的配置就可以适应不同的国家。,本讲所学的知识将能提供一种有助于解决此问题的方法。,对象创建问题,关于,new:,按照面向抽象的设计原则,我们应该面向接口编程而不是面向实现编程。但是我们每次使用,new,时,是不是正在违背这一原则呢?,我们想用接口,但却必须建立一个具体类的实例,Duck duck =new MallardDuck(),问题,当你拥有一组相关的具体类

2、时,你常常被迫写出类似下面的代码:,Duck duck;,If(picnic),duck=new MallardDuck();,else if(hunting),duck=new DecoyDuck();,else if(inBathTub),duck=new RubberDuck();,这样做的原因是直到运行时我们才知道需要实例化那个类。,这样做的后果是如果应用要做变化或扩展,往往要修改这段代码。这使得维护困难并容易引入错误。,问题在哪里?是,new,的问题吗?,从技术上来说,,new,并没有任何问题。,new,是,java,最基本的部分。真正的问题在于,“,变化,”,如果对接口编程,我们可

3、实现与许多,“,变化,”,的隔离,因为通过多态机制,你的代码对于实现接口的新类依然适用。但是使用具体类麻烦就来了,因为增加新的具体类时相应代码可能就必须修改。,怎么办呢?,Duck duck =new MallardDuck(),上面这段代码所在的模块与,MallardDuck,模块形成了耦合。,再回忆我们前面提出的面向对象设计的原则,识别应用的变化部分,并将之与固定的部分相分离。,区分变化的部分,下面我们来看一个例子,Pizza,店,披萨,PizzaStore,类中的一段代码,-,订做,pizza,Public Class PizzaStore,/,Pizza orderPizza(),Pi

4、zza pizza=new Pizza();,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,/,真希望这是一个抽象类或者接口,可惜抽象类或接口都不能被实例化,而且,我们有许多种,pizza,,所以我们增加一些代码,来确定合适的,pizza,种类,然后进行制作。,修改后的代码,Pizza orderPizza(,String,type,),Pizza pizza;,if(type.equals(,“,cheese,”,),pizza=new CheesePizza();,else if(type.eq

5、uals(,“,greek,”,),pizza=new GreekPizza();,else if(type.equals(,“,pepperoni,”,),pizza=new PepperoniPizza();,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,根据接受的类型,创建相应的,pizza,实例,并赋值给实例变量。(注意:各种,pizza,实现接口,Pizza),传递,pizza,的类型给方法,orderPizza,每一种,pizza,子类型都知道其制作方法,由于市场竞争。,其他,pizza

6、店推出了新产品,我们也得增加!例如,VeggiePizza,。,GreekPizza,最近不受欢迎,把它从菜单中取消。,于是。,改!改!改!,Pizza orderPizza(String type),Pizza pizza;,if(type.equals(,“,cheese,”,),pizza=new CheesePizza();,else if(type.equals(,“,greek,”,),pizza=new GreekPizza();,else if(type.equals(,“,pepperoni,”,),pizza=new PepperoniPizza();,else if(t

7、ype.equals(,“,veggie,”,),pizza=new VeggiePizza();,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,变与不变,变与不变,Pizza orderPizza(String type),Pizza pizza;,if(type.equals(,“,cheese,”,),pizza=new CheesePizza();,else if(type.equals(,“,greek,”,),pizza=new GreekPizza();,else if(type.eq

8、uals(,“,pepperoni,”,),pizza=new PepperoniPizza();,else if(type.equals(,“,veggie,”,),pizza=new VeggiePizza();,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,这是变化的部分。随着,Pizza,菜单的变化,这部分要跟着不断地变。,这部分是不变的部分。,分离,Pizza orderPizza(String type),Pizza pizza;,if(type.equals(,“,cheese,”,)

9、pizza=new CheesePizza();,else if(type.equals(,“,greek,”,),pizza=new GreekPizza();,else if(type.equals(,“,pepperoni,”,),pizza=new PepperoniPizza();,else if(type.equals(,“,veggie,”,),pizza=new VeggiePizza();,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,把这部分封装在一个只管如何创建,pizza,

10、的对象中,if(type.equals(,“,cheese,”,),pizza=new CheesePizza();,else if(type.equals(,“,greek,”,),pizza=new GreekPizza();,else if(type.equals(,“,pepperoni,”,),pizza=new PepperoniPizza();,else if(type.equals(,“,veggie,”,),pizza=new VeggiePizza();,将创建,pizza,对象的,代码从,orderPizza,方法,中分离出去,专管制作,pizza,的对象,我们将,专管制

11、作,pizza,的对象叫做,Pizza,工厂,Pizza orderPizza(String type),Pizza pizza;,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,P,izzaFactory,要求制作,pizza,pizza,这样,,orderPizza,方法就成为,PizaFactory,的客户。,Pizza,工厂,-SimplePizzaFactory,public class SimplePizzaFactory,public Pizza createPizza(String t

12、ype),Pizza pizza=null;,if(type.equals(,“,cheese,”,),pizza=new CheesePizza();,else if(type.equals(,“,pepperoni,”,),pizza=new PepperoniPizza();,else if(type.equals(,“,veggie,”,),pizza=new VeggiePizza();,return pizza;,P,izza,工厂中定义了,“,生产,”,pizza,的方法。所有客户都可以用它来实例化新的,pizza,对象,这部分代码就是从,orderPizza(),方法中抽出来的

13、和原来的方法一样,也是通过参数确定,pizza,的种类。,思考一下!,这看来好像我们只是把问题从一个对象推给了另一个对象!这样做有什么好处呢?,可以解除客户代码(,PizzaStore,)与具体,Pizza,的耦合。,SimplePizzaFactory,可以有许多个客户,这样,当实现改变时我们只需要修改,SimplePizzaFactory,,而不需修改众多的客户。,提高了聚合度,,PizzaStore,的职责是使用,pizza,对象,,SimplePizzaFactory,的职责是决定创建什么样的,pizza,对象。,重写,PizzaStore,类,public class PizzaS

14、tore,SimplePizzaFactory factory;,public PizzaStore(SimplePizzaFactory factory),this.factory=factory;,public Pizza orderPizza(String type),Pizza pizza;,pizza=factory.createPizza(type);,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,/other methods here,简单工厂模式,PizzaStore,orderPi

15、zza(),SimplePizzaFactory,createPizza(),Pizza,Prepare(),Bake(),Cut(),Box(),CheeseP,izza,VeggiePizza,ClamPizza,PepperoniPizza,Pizza,可以是一个抽象类,也可以是一个接口。,PizzaStore1,orderPizza(),框架,框架的,对外接口,简单工厂模式,Client,orderProduct(),SimpleFactory,createProduct(),AbstractProduct,methodOfProduct(),Product1,Product2,Pro

16、duct3,Productn,有人认为这还不是一个真正的模式,只是一种程序设计的习惯。,授权,pizza,店,我们的,pizza,店非常成功,许多人都想开设我们的授权加盟店。,但是,不同地区的加盟,pizza,店可能希望供应不同口味的,pizza,。怎么解决这个问题呢?,解决方法之一:建立不同的工厂,建立不同的工厂:如,NYPizzaFactory,、,ChicagoPizzaFactory,、,CaliforniaPizzaFactory,在,PizzaStore,中包含相应工厂的实例。其代码类似于:,/,该,pizza,店提供纽约风味的,pizza,NYPizzaFactory nyFac

17、tory=new NYPizzaFactory();/,建立一个生产纽约风味,pizza,的工厂,PizzaStore nyStore=new PizzaStore(nyFactory);/,建立一个,pizza,店,引用纽约风味,pizza,的工厂,nyStore.orderPizza(,“,Veggie,”,);/,生产的是纽约风味的,pizza,/,该,pizza,店提供芝加哥风味的,pizza,ChicagoPizzaFactory chicagoFactory=new ChicagoPizzaFactory();,PizzaStore chicagoStore=new PizzaSt

18、ore(chicagoFactory);,chicagoStore.orderPizza(,“,Veggie,”,);,抽象工厂模式,这么多工厂,可以再增加抽象层,让我们一起来设计,AbstractFactory,createProduct(),ConcreteFactory,createProduct(),另一种解决方法,-,工厂方法模式,思路:改写的,PizzaStore,,将,createPizza(),方法放回到,PizzaStore,,但是声明为抽象方法,然后,为每一种地方风味创建一个,PizzaStore,的子类。,改造后的,PizzaStore,的代码,public abstra

19、ct class PizzaStore,public Pizza orderPizza(String type),Pizza pizza=createPizza(type);,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,abstract Pizza createPizza(String type);,在,PizzaStore,内调用自身的一个方法来制造,pizza,,而不是使用一个,factory,对象,factory,对象成了这里的一个抽象方法,下面我们需要,PizzaStore,的各种子类(对

20、应不同的地区风味),让子类做决定,PizzaStore,createPizza(),orderPizza(),NYPizzaStore,createPizza(),ChicagoPizzaStore,createPizza(),Pizza createPizza(String item),if(item.equals(,“,奶酪,),return new NYStyleCheesePizza();,else if(item.equals(,“,蔬菜,),return new NYStyleVeggiePizza();,else if(item.equals(,“,卡姆,),return new

21、 NYStyleClamPizza();,else if(item.equals(,“,辣香肠,),return new NYStylePepperoniPizza();,else return null;,讨论:为什么说是由子类做决定的?,PizzaStore,createPizza(),orderPizza(),NYPizzaStore,createPizza(),ChicagoPizzaStore,createPizza(),public abstract class PizzaStore,public Pizza orderPizza(String type),Pizza pizza=

22、createPizza(type);,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,abstract Pizza createPizza(String type);,现在让我们来编写子类,NYPizzaStore,PizzaStore,createPizza(),orderPizza(),NYPizzaStore,createPizza(),ChicagoPizzaStore,createPizza(),public class NYPizzaStore extends PizzaStore,Piz

23、za createPizza(String item),if(item.equals(,“,奶酪,),return new NYStyleCheesePizza();,else if(item.equals(,“,蔬菜,),return new NYStyleVeggiePizza();,else if(item.equals(,“,卡姆,),return new NYStyleClamPizza();,else if(item.equals(,“,辣香肠,),return new NYStylePepperoniPizza();,else return null;,怎么编写子类,Chicag

24、oPizzaStore?,试试看,声明工厂方法,public abstract class PizzaStore,public Pizza orderPizza(String type),Pizza pizza=createPizza(type);,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,return pizza;,abstract Pizza createPizza(String type);,实例化,pizza,的责任现在由一个方法承担。该方法相当于一个工厂。我们称之为工厂方法。,P,izzaStore,的子类用,c

25、reatePizza(),方法处理对象的实例化。,声明工厂方法,abstract Pizza createPizza(String type);,abstract Product factoryMethod(String type);,工厂方法是抽象的,在一个超类中定义。必须由子类来实现。,工厂方法返回一个产品,该产品通常在其所在类的方法中定义。(如,orderPizza(),),工厂方法通常提供参数,用以选择一个产品的不同品种。,工厂方法将客户(超类中的方法,如,PizzaStore,中的,orderPizza(),)与具体的产品相隔离。,工厂方法怎么工作?,假定张三喜欢纽约风味的,pizz

26、a,,李四喜欢芝加哥风味的,pizza,。,需要相应,Pizza,店的实例,调用,orderPizza(),订购想要的,pizza,品种,createPizza(),被调用,并返回,pizza,到,orderPizza(),方法。,尽管不知道是什么,pizza,,但,orderPizza(),仍知道对它进行后续处理。,以张三订购,pizza,为例,PizzaStore nyPizzaStore=new NYPizzaStore();,nyPizzaStore.orderPizza(,“,cheese,”,),在,orderPizza(),方法中,Pizza pizza=c,reatePizza

27、cheese,”,),;,在,orderPizza(),方法中,pizza.prepare();,pizza.bake();,pizza.cut();,pizza.box();,忘记了产品,:pizza,先来个抽象的,import java.util.ArrayList;,public,abstract,class Pizza,String name;,String dough;/,生面团,String sauce;,ArrayList toppings=new ArrayList();,void prepare(),System.out.println(Preparing +name

28、);,System.out.println(Tossing dough.);,System.out.println(Adding sauce.);,System.out.println(Adding toppings:);,for(int i=0;i toppings.size();i+),System.out.println(+toppings.get(i);,void bake()System.out.println(Bake for 25 minutes at 350);,void cut()System.out.println(Cutting the pizza into diagon

29、al slices);,void box()System.out.println(Place pizza in official PizzaStore box);,public String getName()return name;,再来个具体的,public class NYStyleCheesePizza extends Pizza,public NYStyleCheesePizza(),name=NY Style Sauce and Cheese Pizza;,dough=Thin Crust Dough;,sauce=Marinara Sauce;,toppings.add(Grat

30、ed Reggiano Cheese);,Marinara,(mariners)sauce is an Italian red sauce,usually made with,tomatoes,garlic,herbs,(such as,basil,),and,onion,再来个另一风味的,public class ChicagoStyleCheesePizza extends Pizza,public ChicagoStyleCheesePizza(),name=Chicago Style Deep Dish Cheese Pizza;,dough=Extra Thick Crust Dou

31、gh;,sauce=Plum Tomato Sauce;,toppings.add(Shredded Mozzarella Cheese);,void cut(),System.out.println(Cutting the pizza into square slices);,测试主类,public class PizzaTestDrive,public static void main(String args),PizzaStore nyStore,=new NYPizzaStore();,PizzaStore chicagoStore,=new ChicagoPizzaStore();,

32、Pizza pizza=nyStore.,orderPizza,(cheese);,System.out.println(,“,张三,ordered a +pizza.getName()+n);,pizza=chicagoStore.,orderPizza,(cheese);,System.out.println(,“,李四,ordered a +pizza.getName()+n);,工厂方法模式中的类,创建者类,The Creator classes,PizzaStore,createPizza(),orderPizza(),NYPizzaStore,createPizza(),Chica

33、goPizzaStore,createPizza(),Abstract creator,Concrete creators,工厂方法模式中的类,产品类,The Product classes,Pizza,NYStyleCheesePizza,ChicagoStyleCheesePizza,createPizza(),NYStylePepperoniPizza,NYStyleCalmPizza,NYStyleVeggiePizza,ChicagoStylePepperoniPizza,createPizza(),ChicagoStyleCalmPizza,createPizza(),Chicag

34、oStyleVeggiePizza,createPizza(),Abstract product,Concrete products,工厂方法模式的正式定义,在类中定义一个用于创建对象的接口方法,让其子类决定实例化哪一个类。通过这种做法,使得工厂方法的客户(工厂方法的使用者)不必了解具体应该实例化哪一个类。,如:,pizza=pizzaStore.,orderPizza,(cheese);,生产出来的匹萨是纽约风味的还是芝加哥风味的取决于,pizzaStore,引用的是哪个,PizzaStore,的子类,工厂方法模式的结构,Product,ConcreteCreator,factoryMeth

35、od(),ConcreteProduct,Creator,factoryMethod(),anOperation,总结:,Factory Method,模式,意图,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式让一个类的实例化延迟到其子类。使得对象的创建与对象的使用分离开来。,别名,虚拟构造器,工厂方法模式的优点与适用场景,优点,让用户代码与特定类,Product,的子类,ConcretProduct,的代码解耦。,用户不必知道它所使用的对象是怎么创建的,只需要知道这些对象的用法即可。,适用场景,希望让用户使用某些类,但不希望与这些类形成耦合(用,new,)。,用户需要一个

36、类的子类的实例,但不知道该类有哪些子类可用。,工厂方法模式的好处,Product,ConcreteCreator,factoryMethod(),ConcreteProduct,Creator,factoryMethod(),anOperation,用户程序只需要和这些类打交道,总结:,Factory Method,参与者,Product,(,document,),定义工厂方法所创建对象的接口。,ConcreteProduct,(,mydocument,),实现,product,接口。,Creator,(,application,),声明工厂方法,可以调用工厂方法以创建一个,product,对

37、象,ConcreteCreator,(,MyApplication,),重新定义工厂方法,以返回一个,ConcreteProduct,实例,工厂方法的经典范例:,java,迭代器,Collection,接口中定义了,iterator(),方法,所有的集合类都实现了这个方法。,iterator(),方法就是一个工厂方法。其使用者不必了解需要实例化哪个类。,import java.util.*;,public class ShowIterator,public static void main(String args),List list=Arrays.asList(new String “fou

38、ntaun”,”rocket”,“tree”);,Iterator iter=list.iterator();,while(iter.hasNext(),System.out.println(iter.next();,抽象工厂解决的问题,抽象工厂模式是避免必须修改所有,new,调用问题的一个有效策略。抽象工厂的所有具体化有一个共同的主题,使用工厂来创建实现了已知接口,但类型尚不明确的对象。,抽象工厂一般与单例模式联系在一起。由单例模式获得抽象工厂,由抽象工厂制造实际类型未知的产品对象。,经典例句,Image im=Toolkit.getDefaultToolkit().createImage(

39、i);,每次调用,getDefaultToolkit(),方法得到的是同一个,Toolkit,实例。,createImage(),是,Toolkit,的一个方法。,习题(上机完成),某连锁超市为留住顾客,决定发行会员卡。会员卡分为金卡、银卡、普通卡等多种类型,卡的类型可能还会增加。不论是什么卡,其编号都是统一编制的,即使用同一个编号序列。某软件公司承接了该项目,设计人员觉得应该将系统设计的具有一定的通用性,不仅可以较方便的应对该连锁店的需求变化(增减卡的类型),而且可以较容易的修改扩展,为其他公司提供发卡(卡的风格可能不同)服务。假定你是该软件公司的设计师,请你运用学过的设计模式设计该系统的架构。编写实验报告,要求画出相应的类图,提供示意性,java,源程序。实验报告发至,sam84149.,

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服