分享
分销 收藏 举报 申诉 / 28

类型抽象工厂与原型模式.ppt

  • 上传人:仙人****88
  • 文档编号:14742713
  • 上传时间:2026-11-12
  • 格式:PPT
  • 页数:28
  • 大小:1.19MB
  • 下载积分:10 金币
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    抽象 工厂 原型 模式
    资源描述:
    单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,IMC,抽象工厂与原型模式,Theme1,老师:吴映波制作:陈 晨组员:解 凝,吴鹏发,陈 晨,抽象工厂模式案例,抽象工厂模式特点,原型模式案例,原型模式特点,抽象工厂与原型模式的对比,目录,CONTENTS,抽象工厂,抽象工厂模式,案例,1,抽象工厂,抽象工厂,抽象,工厂,人种(,Product,产品类),八卦炉(生产的工厂类),案例:女娲造人,女性八卦炉(只生产女性人种),男性八卦炉(只生产男性人种),肤色性别坐标图,类 图,抽象工厂,这个类图虽然大,但是比较简单,,Java,的典型类图,一个接口,多个抽象类,然后是,N,个实现类,每个人种都是一个抽象类,性别是在各个实现类中实现的。特别需要说明的是,HumanFactory,接口,在这个接口中定义了三个方法,分别用来生产三个不同肤色的人种,也就是我们在上图中的,Y,坐标,它的两个实现类分别是性别,也就是上图中的,X,坐标,通过,X,坐标(性别)和,Y,坐标,(,肤色,),唯一确定了一个生产出来的对象:什么性别的人种。,参与者,AbstractFactory,声明一个创建抽象产品对象的操作接口,ConcreteFactory,实现创建具体产品对象的操作,AbstractProduct,为一类产品对象声明一个接口,ConcreteProduct,定义一个将被相应的具体工厂创建的产品对象,实现,AbstractProduct,接口,Client,仅使用由,AbstractFactory,和,AbstractProduct,类声明的接口,Human,接口代码,抽象工厂,人种有三个抽象类,负责人种的抽象属性定义:肤色和语言,白色人种、黑色人种、黄色人种代码如下,黑色人种和黄色人种代码,抽象工厂,每个抽象类都有两个实现类,分别实现公共的最细节、最具体的事物:肤色和语言。具体的实现类肤色性别定义,以黄色女性人种为例,黄色女性人种代码,抽象工厂,黄色男性人种代码,抽象工厂,其他的黑色人种、白色人种的男性和女性的代码与此类似,不再重复编写。到此为止,我们已经把真实世界的人种都定义出来了,剩下的工作就是怎么制造人类。,接口,HumanFactory,代码,抽象工厂,我们看到八卦炉是可以生产出不同肤色人种的。,那它有多少个八卦炉呢?两个,分别生产女性和男性,女性和男性八卦炉。,FemaleFactory,接口和,MaleFactory,接口,抽象工厂,运行结果,-,生产一个黄色女性,-,黄色人种的皮肤颜色是黄色的!,黄色人种会说话,一般说的都是双字节。,黄人女性,-,生产一个黄色男性,-,黄色人种的皮肤颜色是黄色的!,黄色人种会说话,一般说的都是双字节。,黄人男性,女娲造人,抽象工厂,人种有了,创建它的八卦炉也有了,我们就来重现一下当年女娲造人的光景,抽象工厂,模式简介,抽象工厂模式(,Abstract Factory Pattern,)是一种比较常用的模式,其定义如下:,Provide an interface for creating families of related or dependent objects without specifying their concrete classes,。,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。,抽象工厂,2,抽象工厂模式,特点,抽象工厂,抽象工厂模式,优点与缺点,优点,抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。,当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。,抽象工厂,优点,增加新的具体工厂和产品族很方便,无须修改已有系统,符合,“,开闭原则,”,。,缺点,增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对,“,开闭原则,”,的支持呈现倾斜性。,缺点,如果要增加一个人种,蓝种人,也就是说有产品家族由原来的,2,个,增加到,3,个,看看我们的程序有多大改动吧!抽象类,HumanFactory,要增加一个方法,createBlueHuman(),,然后,两个实现类,FemaleFactory,和,MaleFactory,都要修改,想想看,这在项目中的话,还这么让人活!严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改。,3,原型模式,案例,原型模式,原型,模式,案例:银行广告信,现在电子账单越来越流行了,比如你的信用卡,到月初的时候银行就会发一份电子邮件到你邮箱中,说你这个月消费了多少,什么时候消费的,积分是多少等等,这是每个月发一次,还有一种也是银行发的邮件你肯定非常有印象:广告信,现在各大银行的信用卡部门都在拉拢客户,电子邮件是一种廉价、快捷的通讯方式,你用纸质的广告信那个费用多高呀,比如我行今天推出一个信用卡刷卡抽奖活动,通过电子账单系统可以一个晚上发送给,600,万客户,为什么要用电子账单系统呢?直接找个发垃圾邮件工具不就解决问题了吗?是个好主意,但是这个方案在金融行业是行不通的,为什么?因为银行发送该类邮件是有要求的:,个性化服务,一般银行都要求个性化服务,发过去的邮件上总有一些个人信息吧,比如,“,XX,先生,”,,,“,XX,女士,”,等等。,递送成功率,邮件的递送成功率有一定的要求,由于大批量的发送邮件会被接收方邮件服务器误认是垃圾邮件,因此在邮件头要增加一些伪造数据,以规避被反垃圾邮件引擎误认为是垃圾邮件。,原型模式,原型,模式,案例:银行广告信,原型模式,Cloneable,接口(,Java,自带的一个接口),Mail,实现了这个接口,在,Mail,类中覆写,clone(),方法,邮件,类,publicclassMailimplementsCloneable,/,收件人,privateStringreceiver;,/,邮件名称,privateStringsubject;,/,称谓,privateStringappellation;,/,邮件内容,privateStringcontxt;,/,邮件的尾部,一般都是加上,XXX,版权所有,等信息,privateStringtail;,/,构造函数,publicMail(AdvTemplateadvTemplate),this.contxt=advTemplate.getAdvContext();,this.subject=advTemplate.getAdvSubject();,原型模式,Override,publicMailclone(),Mailmail=null;,try,mail=(Mail)super.clone();,catch(CloneNotSupportedExceptione),/TODOAuto-generatedcatchblock,e.printStackTrace();,returnmail;,邮件,类,原型模式,/,以下为,getter/setter,方法,publicStringgetReceiver(),returnreceiver;,publicvoidsetReceiver(Stringreceiver),this.receiver=receiver;,publicStringgetSubject(),returnsubject;,publicvoidsetSubject(Stringsubject),this.subject=subject;,publicStringgetAppellation(),returnappellation;,publicvoidsetAppellation(Stringappellation),this.appellation=appellation;,publicStringgetContxt(),returncontxt;,publicvoidsetContxt(Stringcontxt),this.contxt=contxt;,publicStringgetTail(),returntail;,publicvoidsetTail(Stringtail),this.tail=tail;,Client,类,(场景类),publicclassClient,/,发送账单的数量,这个值是从数据库中获得,privatestaticintMAX_COUNT=6;,publicstaticvoidmain(Stringargs),/,模拟发送邮件,inti=0;,/,把模板定义出来,这个是从数据中获得,Mailmail=newMail(newAdvTemplate();,mail.setTail(XX,银行版权所有,);,while(iMAX_COUNT),/,以下是每封邮件不同的地方,MailcloneMail=mail.clone();,cloneMail.setAppellation(getRandString(5)+,先生(女士),);,cloneMail.setReceiver(getRandString(5)+getRandString(8)+.com);,/,然后发送邮件,sendMail(cloneMail);,i+;,原型模式,注意看,Client,类中的黑体字,mail.clone(),这个方法了吗?把对象拷贝一份,产生一个新的对象,和原有对象一样,然后再修改细节的数据,如设置称谓、设置收件人地址等等。这种不通过,new,关键字来产生一个对象,而是通过对象拷贝来实现的模式就叫做原型模式。,运行结果,运行结果如下所示。,标题:,XX,银行国庆信用卡抽奖活动,收件人:,fjQUmZnkyPSsL.com,.,发送成功!,标题:,XX,银行国庆信用卡抽奖活动,收件人:,ZIKnCNOKdloNM.com,.,发送成功!,标题:,XX,银行国庆信用卡抽奖活动,收件人:,zNkMIHpMMSZ,.,发送成功!,标题:,XX,银行国庆信用卡抽奖活动,收件人:,oMTFAuBwkR,.,发送成功!,标题:,XX,银行国庆信用卡抽奖活动,收件人:,TquWTTLLVNF,.,发送成功!,标题:,XX,银行国庆信用卡抽奖活动,收件人:,rkQbpmfATHDQH.com,.,发送成功!,原型,模式优缺点,缺点,由于原型模式需要给每个类都配备一个克隆的方法,这就需要在设计时通盘考虑,因为在已有的类的基础上添加,clone,操作时比较困难的,优点,在原型模式中,可以动态地添加产品类,而且对整体结构没有影响。,原型模式,(,Prototype Pattern,)先实例化一个类,然后克隆或者拷贝该类来构建新的实例。使用,Prototype,模式创建的实例,具有与原型一样的初始化数据,英文定义为:,Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.,适用场景,当创建对象时,使用者不需要知道对象是如何创建的,只需要复制一个已有对象,然后在其上面进行修改以得到自己想要的对象,这个时候可以采用原型模式。,原型模式,适用场景,资源优化场景,类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。,性能和安全要求的场景,通过,new,产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。,一个对象多个修改者的场景,一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。,4,抽象工厂与,原型模式,对比,设计模式,应用原型模式,如果要增加一个人种,只需要复制一个已有对象,然后在其上面进行修改以得到自己想要的对象即可。,性能优良,原型模式是在内存二进制流的拷贝,要比直接,new,一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好的体现其优点。,用,Protype,模式改善,Abstract Factory,模式不足之处,设计模式,抽象工厂缺点,如果要增加一个人种,蓝种人,也就是说有产品家族由原来的,2,个,增加到,3,个,看看我们的程序有多大改动吧!抽象类,HumanFactory,要增加一个方法,createBlueHuman(),,然后,两个实现类,FemaleFactory,和,MaleFactory,都要修改,想想看,这在项目中的话,还这么让人活!严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改。,Human,类,publicclassHumanimplementsCloneable,/,性别,privateStringsex;,/,肤色,privateStringcolor;,/,语言,privateStringtalk;,/,器官,privateStringorgans;,/,构造函数,publicHuman(HumanTemplatehumanTemplate),this.organs=advTemplate.getOrgans();,设计模式,Override,publicHumanclone(),Humanhuman=null;,try,human=(Human)super.clone();,catch(CloneNotSupportedExceptione),/TODOAuto-generatedcatchblock,e.printStackTrace();,return human;,Human,类,设计模式,/,以下为,getter/setter,方法,publicStringgetSex(),returnsex;,publicvoidsetSex(Stringsex),this.sex=sex;,publicStringgetColor(),returncolor;,publicvoidsetColor(Stringcolor),this.color=color;,publicStringgetTalk(),returntalk;,publicvoidsetTalk(Stringtalk),this.talk=talk;,publicStringgetOrgans(),returnorgans;,publicvoidsetOrgans(Stringorgans),this.organs=organs;,publicclassNvwa,/,女娲造人的数目,privatestaticintMAX_COUNT=6;,publicstaticvoidmain(Stringargs),inti=0;,/,把模板定义出来,Humanhuman=newHuman(newHumanTemplate();,while(iMAX_COUNT),/,以下是每种人不同的地方,HumancloneHuman=human.clone();,cloneHuman.setColor(RandColor();,cloneHuman.setSex(RandSex();,./,设置其他属性值,i+;,设计模式,Client,类,(场景类),Thanks!,
    展开阅读全文

    开通VIP折扣优惠下载文档

    提示  咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。

    咨信网小贴示:
    1、浏览或下载可查看了解,请点击【咨信网告知】。
    2、下载文件中如有侵权或不适当内容,将立即纠正。
    3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
    4、开具发票登录电脑端申请,请点击【索取发票】。

    咨信网客服组:【微信客服】

    自信AI创作助手
    关于本文
    本文标题:抽象工厂与原型模式.ppt
    链接地址:https://www.zixin.com.cn/doc/14742713.html

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


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

    自信网络  |  ZixinNetwork