8_JAVA设计模式第八课:SingleCall模式.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8_JAVA设计模式第八课:SingleCall模式

在本文中,作者向大家讲述了Single Call 模式的原理,同时也介绍了Single Call 模式的实现问题。 在进行面向对象得分析与设计的实践过程中我们经常会遇到聚合(Aggregations)与组合(Composition)这两种关系,聚合是一种关联形式,它指明一个聚集(整体)和组成部分之间的整体与部分的关系。组合是指一种带有很强主从关系,成分的生命期一致的聚集关联形式。一个部分可以仅属于一个组成。没有固定多重性的部分可以在组成创建后再被创建。但是一旦被创建,这些部分将与组成同时存在并同时消亡(共享生存周期)。这些部分也可以在组成消失前被移开。组成可以是递归的。 一个典型的聚合的例子是计算机,计算机的个部分和主机是松散的从属关系,一台计算机的外设可以随时接到另一台主机上使用,也就是说计算机的主机和外设有各自的生存周期,例如如果主机发生了故障,我们仍然可以把显示器接到另一台计算机上使用。 典型组合关系的例子是桌子,下图表示的就是桌子类(Coffee Table),它包括桌面类(Table Top)和桌腿类(Leg),桌面和桌腿只能从属于桌子而不会从属于其他,当桌子不存在时,桌面和桌腿也就没有意义了,也就是说三个类处于一个生存周期。 我们来考虑下面的例子,比如我们现在需要一个汽车类(Car)和一个发动机类(Engine),这两个类是个典型的组合组合关系,也就是说发动机类能在汽车类的里面被实例化而且只能在汽车类被实例化。可是我们在开发的过程中如何实现组合关系呢? 首先,我们必须保证Engine类不能直接被实例化,为了达到这个目的我们必须屏蔽掉Engine类的构造函数,例如: public class Engine { private Engine() { } }这样我们就不能直接用new Engine()的方法来创建实例,而只能通过Engine类的一个静态方法来得到Engine类的实例,例如: public class Engine { private Engine() { } static Engine getobject() { new Engine(); } }这种方法和我们实现singleton的方法是一模一样的。现在我们的Engine类已经不能直接被实例化了,但是还不能保证它只能被Car类实例化,因为在任何类中我们都可以用Engine engine=Engine.getobject()的方法得到Engine类的实例。为了保证Engine类是被Car类实例化的我们可以在Car类调用Engine.getobject()时把自己本身的引用作为一个参数传到Engine类中,例如Engine engine=Engine.getobject(this),这时的Engine类必须要做一点修改 public class Engine { private Engine() { } static Engine getobject(Car o) { new Engine(); } }这样只有在Car类中执行Engine engine=Engine.getobject(this)时,才能真正返回一个Engine类的实例。否则会收到一个类型不匹配的异常。 我们可能觉得到现在应该大功告成了,原来实现这么简单。 可是,细心的人会发现这样的设计存在一个很大的漏洞,Engine类虽然我们屏蔽掉了它的构造函数,但是Car类的构造函数我们并没有屏蔽掉,在任何类中如果我们执行 Engine engine=Engine.getobject(new Car())我们仍然可以得到一个Engine类的实例,这样的结果是我们不能接受的,所以我们还要做一些改动。 //Engine.java public class Engine { private Engine() { } static Engine getobject(Car o) { if (o.can_load() ) { return( new Engine()); } else return null; } }我们看到在Car类中增加了一个方法--can_load(),用这个方法能我们能判断出Engine.getobject方法是不是从Car类内部调用的,如果是我们就返回一个Engine类的实例,否则我们就返回一个空指针null,相应的Car类的代码如下。 //Car.java public class Car { private Engine engine; private boolean can_lo

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档