版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、工厂模式式是我们们最常用用的模式式了,著著名的JJivee论坛 ,就大大量使用用了工厂厂模式,工厂模模式在JJavaa程序系系统可以以说是随随处可见见。为什么工工厂模式式是如此此常用?因为工工厂模式式就相当当于创建建实例对对象的nnew,我们经经常要根根据类CClasss生成成实例对对象,如如A aa=neew AA() 工厂模模式也是是用来创创建实例例对象的的,所以以以后nnew时时就要多多个心眼眼,是否否可以考考虑实用用工厂模模式,虽虽然这样样做,可可能多做做一些工工作,但但会给你你系统带带来更大大的可扩扩展性和和尽量少少的修改改量。我们以类类Sammplee为例, 如果果我们要要创建SS
2、ampple的的实例对对象:Sampple sammplee=neew SSampple();可是,实实际情况况是,通通常我们们都要在在创建ssampple实实例时做做点初始始化的工工作,比比如赋值值 查询询数据库库等。首先,我我们想到到的是,可以使使用Saamplle的构构造函数数,这样样生成实实例就写写成:Sampple sammplee=neew SSampple(参数);但是,如如果创建建sammplee实例时时所做的的初始化化工作不不是象赋赋值这样样简单的的事,可可能是很很长一段段代码,如果也也写入构构造函数数中,那那你的代代码很难难看了(就需要要Reffacttor重重整)。为什么
3、说说代码很很难看,初学者者可能没没有这种种感觉,我们分分析如下下,初始始化工作作如果是是很长一一段代码码,说明明要做的的工作很很多,将将很多工工作装入入一个方方法中,相当于于将很多多鸡蛋放放在一个个篮子里里,是很很危险的的,这也也是有背背于Jaava面面向对象象的原则则,面向向对象的的封装(Enccapssulaatioon)和和分派(Dellegaatioon)告告诉我们们,尽量量将长的的代码分分派“切切割”成成每段,将每段段再“封封装”起起来(减减少段和和段之间间偶合联联系性),这样样,就会会将风险险分散,以后如如果需要要修改,只要更更改每段段,不会会再发生生牵一动动百的事事情。在本例中中
4、,首先先,我们们需要将将创建实实例的工工作与使使用实例例的工作作分开, 也就就是说,让创建建实例所所需要的的大量初初始化工工作从SSampple的的构造函函数中分分离出去去。这时我们们就需要要Facctorry工厂厂模式来来生成对对象了,不能再再用上面面简单nnew Sammplee(参数数)。还还有,如如果Saamplle有个个继承如如MySSampple, 按照照面向接接口编程程,我们们需要将将Sammplee抽象成成一个接接口.现现在Saamplle是接接口,有有两个子子类MyySammplee 和HHisSSampple .我们们要实例例化他们们时,如如下:Sampple myssam
5、pple=neww MyySammplee();Sammplee hiissaamplle=nnew HissSammplee();随着项目目的深入入,Saamplle可能能还会生出很很多儿子子出来, 那那么我们们要对这这些儿子子一个个个实例化化,更糟糟糕的是是,可能能还要对对以前的的代码进进行修改改:加入入后来生生出儿子子的实例例.这在在传统程程序中是是无法避避免的.但如果你你一开始始就有意意识使用用了工厂厂模式,这些麻麻烦就没没有了.工厂方法法你会建建立一个个专门生生产Saamplle实例例的工厂厂:publlic claass Facctorrypuubliic sstattic Sam
6、mplee crreattor(intt whhichh)/gettClaass 产生SSampple 一般可可使用动动态类装装载装入入类。iff (wwhicch=1)retturnn neew SSamppleAA();eelsee iff (wwhicch=2)retturnn neew SSamppleBB();那么在你你的程序序中,如如果要实实例化SSampple时时.就使使用Sampple sammpleeA=FFacttoryy.crreattor(1);这样,在在整个就就不涉及及到Saamplle的具具体子类类,达到到封装效效果,也也就减少少错误修修改的机机会,这这个原理理可以
7、用用很通俗俗的话来来比喻:就是具具体事情情做得越越多,越越容易范范错误.这每个个做过具具体工作作的人都都深有体体会,相相反,官官做得越越高,说说出的话话越抽象象越笼统统,范错错误可能能性就越越少.好好象我们们从编程程序中也也能悟出出人生道道理?呵呵呵.使用工厂厂方法 要注意意几个角角色,首首先你要要定义产产品接口口,如上上面的SSampple,产品接接口下有有Sammplee接口的的实现类类,如SSamppleAA,其次次要有一一个faactoory类类,用来来生成产产品Saamplle,如如下图,最右边边是生产产的对象象Sammplee:进一步稍稍微复杂杂一点,就是在在工厂类类上进行行拓展,
8、工厂类类也有继继承它的的实现类类conncreeteFFacttoryy了。抽象工厂厂工厂模模式中有有: 工工厂方法法(Faactoory Metthodd) 抽抽象工厂厂(Abbstrractt Faactoory).这两个模模式区别别在于需需要创建建对象的的复杂程程度上。如果我我们创建建对象的的方法变变得复杂杂了,如如上面工工厂方法法中是创创建一个个对象SSampple,如果我我们还有有新的产产品接口口Sammplee2.这里假设设:Saamplle有两两个cooncrretee类SaamplleA和和SammleBB,而SSampple22也有两两个cooncrretee类Saampll
9、e2AA和SaamplleB22那么,我我们就将将上例中中Facctorry变成成抽象类类,将共共同部分分封装在在抽象类类中,不不同部分分使用子子类实现现,下面面就是将将上例中中的Faactoory拓拓展成抽抽象工厂厂:publlic absstraact claass Facctorrypuubliic aabsttracct SSampple creeatoor();puubliic aabsttracct SSampple22 crreattor(Strringg naame); publlic claass SimmpleeFacctorry eexteendss Faactooryp
10、uubliic SSampple creeatoor().rretuurn neww SaamplleApuubliic SSampple22 crreattor(Strringg naame).retturnn neew SSampple22Apubllic claass BommbFaactoory exttendds FFacttoryypuubliic SSampple creeatoor().retturnn neew SSamppleBB puubliic SSampple22 crreattor(Strringg naame).retturnn neew SSampple22B从
11、上面看看到两个个工厂各各自生产产出一套套Sammplee和Saamplle2,也许你你会疑问问,为什什么我不不可以使使用两个个工厂方方法来分分别生产产Sammplee和Saamplle2? 抽象工厂厂还有另另外一个个关键要要点,是是因为 SimmpleeFacctorry内,生产SSampple和和生产SSampple22的方法法之间有有一定联联系,所所以才要要将这两两个方法法捆绑在在一个类类中,这这个工厂厂类有其其本身特特征,也也许制造造过程是是统一的的,比如如:制造造工艺比比较简单单,所以以名称叫叫SimmpleeFacctorry。在实际应应用中,工厂方方法用得得比较多多一些,而且是是和
12、动态态类装入入器组合合在一起起应用。举例我们以JJivee的FoorummFacctorry为例例,这个个例子在在前面的的Sinngleetonn模式中中我们讨讨论过,现在再再讨论其其工厂模模式:publlic absstraact claass ForrumFFacttoryy prrivaate staaticc Obbjecct iinittLocck = neew OObjeect();prrivaate staaticc Sttrinng cclasssNaame = comm.jiivessofttwarre.fforuum.ddataabasse.DDbFoorummFaccto
13、rry;pprivvatee sttatiic FForuumFaactoory facctorry = nuull; puubliic sstattic ForrumFFacttoryy geetInnstaancee(Auuthoorizzatiion autthorrizaatioon) /Iff noo vaalidd auuthoorizzatiion passsedd inn, rretuurn nulll.if (auuthoorizzatiion = nulll) reeturrn nnulll;/以下使使用了SSinggletton 单态模模式iif (facctorry =
14、 nnulll) synnchrroniizedd(innitLLockk) iif (facctorry = nnulll) . tryy /动态转转载类Cllasss c = CClasss.fforNNamee(cllasssNamme);ffacttoryy = (FoorummFacctorry)cc.neewInnstaancee();cattch (Exxcepptioon ee) rretuurn nulll;/NNow, 返回回 prroxyy.用来来限制授授权对fforuum的访访问rretuurn neww FoorummFacctorryPrroxyy(auuthoor
15、izzatiion, faactoory,ffacttoryy.geetPeermiissiionss(auuthoorizzatiion);/真正创创建foorumm的方法法由继承承forrumffacttoryy的子类类去完成成.pubblicc abbstrractt Foorumm crreatteFoorumm(Sttrinng nnamee, SStriing desscriiptiion)tthroows UnaauthhoriizeddExccepttionn, FForuumAllreaadyEExisstsEExceeptiion;.因为现在在的Jiive是是通过数数据库系
16、系统存放放论坛帖帖子等内内容数据据,如果果希望更更改为通通过文件件系统实实现,这这个工厂厂方法FForuumFaactoory就就提供了了提供动动态接口口:privvatee sttatiic SStriing claassNNamee = coom.jjiveesofftwaare.forrum.dattabaase.DbFForuumFaactoory;你可以使使用自己己开发的的创建fforuum的方方法代替替comm.jiivessofttwarre.fforuum.ddataabasse.DDbFoorummFacctorry就可可以.在上面的的一段代代码中一一共用了了三种模模式,除除
17、了工厂厂模式外外,还有有Sinngleetonn单态模模式,以以及prroxyy模式,prooxy模模式主要要用来授授权用户户对foorumm的访问问,因为为访问fforuum有两两种人:一个是是注册用用户 一一个是游游客guuestt,那么么那么相相应的权权限就不不一样,而且这这个权限限是贯穿穿整个系系统的,因此建建立一个个prooxy,类似网网关的概概念,可可以很好好的达到到这个效效果. 看看Jaava宠宠物店中中的CaatallogDDAOFFacttoryy:publlic claass CattaloogDAAOFaactoory /* 本方法法制定一一个特别别的子类类来实现现DAO
18、O模式。* 具体体子类定定义是在在J2EEE的部部署描述述器中。*/puubliic sstattic CattaloogDAAO ggetDDAO() tthroows CattaloogDAAOSyysExxcepptioon CattaloogDAAO ccatDDao = nnulll;tryy IInittiallConntexxt iic = neew IInittiallConntexxt();/动态装装入CAATALLOG_DAOO_CLLASSS/可可以定义义自己的的CATTALOOG_DDAO_CLAASS,从而在在无需变变更太多多代码/的前前提下,完成系系统的巨巨大变更更。SStriing claassNNamee =(Strringg) iic.llookkup(JNDDINaamess.CAATALLOG_DAOO_CLLASSS);ccatDDao = (CattaloogDAAO) Claass.forrNamme(cclasssNaame).neewInnstaancee(); ccatcch (NamminggExccepttionn nee) tthroow nnew CattaloogDAAOSyysExxcepptioo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川成都市投资促进中心招聘2人参考考试题库及答案解析
- 炼制行业融资风险预警机制-洞察及研究
- 交互一致性设计框架-洞察及研究
- 2025中国电信滨海分公司招聘2人备考考试题库及答案解析
- 2025江苏南京机电职业技术学院招聘高层次人才10人考试重点题库及答案解析
- 智慧医院服务全流程优化体系
- 2025年土壤分析协议
- 2026浙江省国贸集团校园招聘备考核心题库及答案解析
- 2026中国铁路郑州局集团有限公司本科及以上学历毕业生专场校园招聘日程考试参考试题及答案解析
- 2025年碳资产审计合同协议
- 教学副院长述职报告课件
- 奋斗的主题班会课件
- 电务段干部考试题及答案
- 委托加工项目管理制度
- 2025年单次式拉丝机项目市场调查研究报告
- 红薯创业项目计划书
- 健美操运动智慧树知到期末考试答案2024年
- Web设计与应用智慧树知到期末考试答案2024年
- 营养支持在ICU的应用课件
- +山东省烟台市芝罘区2023-2024学年七年级上学期期末数学试卷(五四制)+
- 课程设计DLP4-13型锅炉中硫烟煤烟气袋式除尘湿式脱硫系统设计
评论
0/150
提交评论