仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1090|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA教程之在Java中使用计划形式--Factory Method...

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:53:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。计划在计划形式中,FactoryMethod也是对照复杂的一个,但使用十分普遍,EJB,RMI,COM,CORBA,Swing中都能够看到此形式的影子,它是最主要的形式之一.在良多中央我们城市看到xxxFactory如许定名的类,那末,甚么是FactoryMethod,为何要用这个形式,怎样用Java言语来完成该形式,这就是本文想要带给人人的内容.

  基础观点

  FactoryMethod是一种创立性形式,它界说了一个创立对象的接口,可是却让子类来决意详细实例化哪个类.当一个类没法意料要创立哪一种类的对象或是一个类必要由子类来指定创立的对象时我们就必要用到FactoryMethod形式了.复杂说来,FactoryMethod能够依据分歧的前提发生分歧的实例,固然这些分歧的实例一般是属于不异的范例,具有配合的父类.FactoryMethod把创立这些实例的详细历程封装起来了,简化了客户真个使用,也改良了程序的扩大性,使得未来能够做最小的修改就能够到场新的待创立的类.一般我们将FactoryMethod作为一种尺度的创立对象的办法,当发明必要更多的天真性的时分,就入手下手思索向别的创立型形式转化

  复杂剖析

  是FactoryMethod形式的布局图,这里供应了一些术语,让我们能够举行更便利的形貌:

<br>

:FactoryMethod形式布局

  1.Product:必要创立的产物的笼统类.
  2.ConcreteProduct:Product的子类,一系列详细的产物.
  3.Creator:笼统创立器接口,声明前往Product范例对象的FactoryMethod.
  4.ConcreteCreator:详细的创立器,重写Creator中的FactoryMethod,前往ConcreteProduct范例的实例.

  由此能够分明的看出如许的平行对应干系:Product<====>Creator;ConreteProduct<====>ConreteCreator

  笼统产物对应笼统创立器,详细产物对应详细创立器.如许做的优点是甚么呢?为何我们不间接器具体的产物和详细的创立器完成需求呢?实践上我们也能够如许做.但经由过程FactoryMethod形式来完成,客户(client)只需援用笼统的Product和Creater,对详细的ConcreteProduct和ConcreteCreator能够绝不体贴,如许做我们能够取得分外的优点:

  起首客户端能够一致从笼统创立器猎取发生的实例,Creator的感化将client和产物创立历程分别开来,客户不必费心前往的是那一个详细的产物,也不必体贴这些产物是怎样创立的.同时,ConcreteProduct也被埋没在Product前面,ConreteProduct承继了Product的一切属性,并完成了Product中界说的笼统办法,依照Java中的对象外型(cast)准绳,经由过程ConcreteCreator发生的ConcreteProduct能够主动的上溯外型成Product.如许一来,本色内容分歧的ConcreteProduct就能够在情势上一致为Product,经由过程Creator供应给client来会见.

  其次,当我们增加一个新的ConcreteCreator时,因为Creator所供应的接口稳定,客户端程序不会有涓滴的修改,不会带来动一发而牵满身的劫难,这就是优秀封装性的表现.但假如间接用ConcreteProduct和ConcreteCreator两个类是不管怎样也做不到这点的.优秀的面向对象计划勉励利用封装(encapsulation)和托付(delegation),而FactoryMethod形式就是利用了封装和托付的典范例子,这里封装是经由过程笼统创立器Creator来表现的,而托付则是经由过程笼统创立器把创立对象的义务完整交给详细创立器ConcreteCreator来表现的.

  如今,请再转头看看基础观点中的那段话,入手下手大概以为生涩难明,如今是否是已开阔爽朗化了良多.

  上面让我们看看在Java中怎样完成FactoryMethod形式,进一步加深对它的熟悉.

  详细实行

  先申明一点,用FactoryMethod形式创立对象其实不必定会让我们的代码更短,实事上常常更长,我们也利用了更多的类,真实的目标在于如许能够天真的,有弹性的创立不断定的对象.并且,代码的可重用性进步了,客户真个使用简化了,客户程序的代码会年夜年夜削减,变的更具可读性.

  尺度完成:这里我接纳BruceEckel用来形貌OO头脑的典范例子Shape.如许人人会对照熟习一些.我完整依照中所界说的布局写了上面的一段演示代码.这段代码的感化是创立分歧的Shape实例,每一个实例完成两个操纵:draw和erase.详细的创立历程托付?ShapeFactory来完成.

  1.a起首界说一个笼统类Shape,界说两个笼统的办法.

abstractclassShape{
//勾勒shape
publicabstractvoiddraw();
//擦往shape
publicabstractvoiderase();

publicStringname;
publicShape(StringaName){
name=aName;
}
}

  1.b界说Shape的两个子类:Circle,Square,完成Shape中界说的笼统办法

//圆形子类
classCircleextendsShape{
publicvoiddraw(){
System.out.println("Itwilldrawacircle.");
}
publicvoiderase(){
System.out.println("Itwilleraseacircle.");
}
//机关函数
publicCircle(StringaName){
super(aName);
}
}

//方形子类
classSquareextendsShape{
publicvoiddraw(){
System.out.println("Itwilldrawasquare.");
}
publicvoiderase(){
System.out.println("Itwilleraseasquare.");
}
//机关函数
publicSquare(StringaName){
super(aName);
}
}

  1.c界说笼统的创立器,anOperation挪用factoryMethod创立一个对象,并对该对象举行一系列操纵.

abstractclassShapeFactory{
protectedabstractShapefactoryMethod(StringaName);
//在anOperation中界说Shape的一系列举动
publicvoidanOperation(StringaName){
Shapes=factoryMethod(aName);
System.out.println("Thecurrentshapeis:"+s.name);
s.draw();
s.erase();
}
}

  1.d界说与circle和square绝对应的两个详细创立器CircleFactory,SquareFactory,完成父类的methodFactory办法

//界说前往circle实例的CircleFactory
classCircleFactoryextendsShapeFactory{
//重载factoryMethod办法,前往Circle对象
protectedShapefactoryMethod(StringaName){
returnnewCircle(aName+"(createdbyCircleFactory)");
}
}

//界说前往Square实例的SquareFactory
classSquareFactoryextendsShapeFactory{
//重载factoryMethod办法,前往Square对象
protectedShapefactoryMethod(StringaName){
returnnewSquare(aName+"(createdbySquareFactory)");
}
}

  1.e测试类:请注重这个客户端程序何等简便,既没有罗嗦的前提判别语句,也无需体贴ConcreteProduct和ConcreteCreator的细节(由于这里我用anOperation封装了Product里的两个办法,以是连Product的影子也没瞥见,固然把Product里办法的详细挪用放到客户程序中也是不错的).

classMain{
publicstaticvoidmain(String[]args){
ShapeFactorysf1=newSquareFactory();
ShapeFactorysf2=newCircleFactory();
sf1.anOperation("Shapeone");
sf2.anOperation("Shapetwo");
}
}

  运转了局以下:
  Thecurrentshapeis:Shapeone(createdbySquareFactory)
  Itwilldrawasquare.
  Itwilleraseasquare.
  Thecurrentshapeis:Shapetwo(createdbyCircleFactory)
  Itwilldrawacircle.
  Itwilleraseacircle.

  参数化的FactoryMethod:这类体例依托指定的参数作为标记来创立对应的实例,这是很罕见的一种举措.好比JFC中的BorderFactory就是个很不错的例子.以下的这个例子是用字符串作为标志来举行判别的,假如参数的范例也纷歧样,那就能够用到过载函数来办理这个成绩,界说一系列参数和办法体分歧的同名函数,这里java.util.Calendar.getInstance()又是个极好的例子.参数化的创立体例克制了FactoryMethod形式一个最明显的缺点,就是当详细产物对照多时,我们不能不也创建一系列与之对应的详细机关器.可是在客户端我们必需指定参数来决意要创立哪个类.

  2.a我们在第一种办法的基本长进行修正,起首自界说一个的非常,如许当传进不准确的参数时能够失掉更分明的报错信息.

classNoThisShapeextendsException{
publicNoThisShape(StringaName){
super(aName);
}
}

  2.b往失落了ShapeFactory的两个子类,改成由ShapeFactory间接卖力实例的创立.ShapeFactory本人酿成一个详细的创立器,间接用参数化的办法完成factoryMethod前往多种对象.

abstractclassShapeFactory{
privatestaticShapes;
privateShapeFactory(){}

staticShapefactoryMethod(StringaName,StringaType)throwsNoThisShape{
if(aType.compareTo("square")==0)
returnnewSquare(aName);
elseif(aType.compareTo("circle")==0)
returnnewCircle(aName);
elsethrownewNoThisShape(aType);
}

//在anOperation中界说Shape的一系列举动
staticvoidanOperation(StringaName,StringaType)throwsNoThisShape{
s=factoryMethod(aName,aType);
System.out.println("Thecurrentshapeis:"+s.name);
s.draw();
s.erase();
}
}

  2.c测试类:这里客户端必需指定参数来决意详细创立哪一个类.这个例子里的anOperation是静态函数,能够间接援用.

classMain{
publicstaticvoidmain(String[]args)throwsNoThisShape{
ShapeFactory.anOperation("Shapeone","circle");
ShapeFactory.anOperation("Shapetwo","square");
ShapeFactory.anOperation("Shapethree","delta");
}
}

  运转了局以下:
  Thecurrentshapeis:Shapeone
  Itwilldrawacircle.
  Itwilleraseacircle.
  Thecurrentshapeis:Shapetwo
  Itwilldrawasquare.
  Itwilleraseasquare.
  Exceptioninthread"main"NoThisShape:delta
atShapeFactory.factoryMethod(ShapeFactory.java:10)
atShapeFactory.anOperation(ShapeFactory.java:15)
atMain.main(Main.java:5)

  静态装载机制:

  有的时分我们会把ConcreteProduct的实例传给创立器作为参数,这类情形下,假如在创立器里完成创立历程,就必需判别参数的详细范例(用instanceof),然后才干发生响应的实例,那末对照好的做法是使用Java的静态装载机制来完成这件事.好比:

  我们失掉一个Shape的子类s,但不晓得详细是谁人子类,就能够使用Class类自带的办法newInstance()失掉实例

  return(Shape)s.getClass().newInstance();

  这类办法有乐趣得读者能够本人实验,限于篇幅,不写详细代码出来了.

  后话:

  看完这篇文章后,信任读者对FactoryMethod形式有一个对照分明的懂得了.我想说的是,我们不但应当体贴一个详细的形式有甚么感化,怎样往完成这个形式,更应当透过征象看实质,不仅知其然,还要知其以是然.要经由过程对形式的进修加深劈面向对象头脑的了解,让本人的熟悉失掉升华.FactoryMethod形式看似复杂,实则深入.笼统,封装,承继,托付,多态,针对接口编程等面向对象中的观点都在这里失掉了逐一的表现.只要捉住了它的实质,我们才干够不拘于情势的天真使用,而不是为了利用形式而利用形式.

windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的
莫相离 该用户已被删除
沙发
发表于 2015-1-21 16:42:08 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
山那边是海 该用户已被删除
板凳
发表于 2015-1-24 17:51:22 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
兰色精灵 该用户已被删除
地板
发表于 2015-2-2 11:37:26 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
小妖女 该用户已被删除
5#
发表于 2015-2-7 19:12:41 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
爱飞 该用户已被删除
6#
发表于 2015-2-23 01:32:20 | 只看该作者
是一种突破用户端机器环境和CPU
金色的骷髅 该用户已被删除
7#
发表于 2015-2-23 09:26:13 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
海妖 该用户已被删除
8#
发表于 2015-3-3 21:13:54 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
分手快乐 该用户已被删除
9#
发表于 2015-3-7 01:04:24 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
不帅 该用户已被删除
10#
发表于 2015-3-7 18:14:10 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
因胸联盟 该用户已被删除
11#
发表于 2015-3-12 07:12:18 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
小女巫 该用户已被删除
12#
发表于 2015-3-12 17:20:50 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
若天明 该用户已被删除
13#
发表于 2015-3-19 13:26:23 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-19 23:50:50 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
冷月葬花魂 该用户已被删除
15#
发表于 2015-3-29 17:20:43 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
精灵巫婆 该用户已被删除
16#
发表于 2015-4-1 06:10:57 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
谁可相欹 该用户已被删除
17#
发表于 2015-4-11 11:29:29 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
柔情似水 该用户已被删除
18#
发表于 2015-4-21 06:06:08 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
老尸 该用户已被删除
19#
发表于 2015-4-27 08:07:14 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘灵儿 该用户已被删除
20#
发表于 2015-5-10 18:57:45 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 01:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表