当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

"制作更多的对象"[Java编程]

赞助商链接



  本文“"制作更多的对象"[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这样便引出了面向对象程序计划时一条通例的原则,我最早是在Grady Booch那边据说的:“若计划过于复杂,就制作更多的对象”.固然听起来有些暧昧,且简单得好笑,但这确切是我知道的最有效一条原则(大家今后会注意到“制作更多的对象”常常平等于“增添另一个层次的迂回”).普通情形下,假如发现一个地方充斥着大量繁复的代码,就需求考虑什么类能使它显得清爽一些.用这种方法整理系统,常常会得到一个更好的构造,也使程序越发机动.
首先考虑Trash对象初次成立的地方,这是main()里的一个switch语句:

    for(int i = 0; i < 30; i++)
      switch((int)(Math.random() * 3)) {
        case 0 :
          bin.addElement(new
            Aluminum(Math.random() * 100));
          break;
        case 1 :
          bin.addElement(new
            Paper(Math.random() * 100));
          break;
        case 2 :
          bin.addElement(new
            Glass(Math.random() * 100));
      }

这些代码明显“过于复杂”,也是新范例加入时必须窜改代码的场所之一.假如常常都要加入新范例,那么更好的筹划就是成立一个独立的办法,用它获得全部必须的信息,并成立一个句柄,指向精确范例的一个对象——已经上溯造型到一个Trash对象.在《Design Patterns》中,它被大概地称谓为“成立范式”.要在这里利用的特别范式是Factory办法的一种变体.在这里,Factory办法属于Trash的一名static(静态)成员.但更常见的一种情形是:它属于衍生类中一个被过载的办法.
Factory办法的基本原理是我们将成立对象所需的基本信息传送给它,然后返回并等候句柄(已经上溯造型至底子范例)作为返回值呈现.从这时开始,便可以按多形性的方法对待对象了.因此,我们根本没必要知道所成立对象的精确范例是什么.事实上,Factory办法会把自己躲藏起来,我们是看不见它的.这样做可避免不慎的误用.假如想在没有多形性的前提下利用对象,必须明确地利用RTTI和指定造型.
但仍旧存在一个小问题,分外是在底子类中利用更复杂的办法(不是在这里展示的那种),且在衍生类里过载(覆盖)了它的前提下.假如在衍生类里恳求的信息要求更多大概差别的参数,那么该怎么办呢?“成立更多的对象”办理了这个问题.为实现Factory办法,Trash类利用了一个新的办法,名为factory.为了将成立数据躲藏起来,我们用一个名为Info的新类包含factory办法成立得当的Trash对象时需求的全部信息.下面是Info一种简单的实现方法:

class Info {
  int type;
  // Must change this to add another type:
  static final int MAX_NUM = 4;
  double data;
  Info(int typeNum, double dat) {
    type = typeNum % MAX_NUM;
    data = dat;
  }
}

Info对象唯一的任务就是包容用于factory()办法的信息.目前,假定呈现了一种特别情形,factory()需求更多大概差别的信息来新建一种范例的Trash对象,那么再也不需求窜改factory()了.通过增添新的数据和构建器,我们可以改正Info类,大概采取子类处理更典型的面向对象情势.
用于这个简单示例的factory()办法以下:

  static Trash factory(Info i) {
    switch(i.type) {
      default: // To quiet the compiler
      case 0:
        return new Aluminum(i.data);
      case 1:
        return new Paper(i.data);
      case 2:
        return new Glass(i.data);
      // Two lines here:
      case 3: 
        return new Cardboard(i.data);
    }
  }

在这里,对象的精确范例很简单便可判断出来.但我们可以假想一些更复杂的情形,factory()将采取一种复杂的算法.无论若何,目前的关键是它已躲藏到某个地方,并且我们在增添新范例时知道去那个地方.
新对象在main()中的成立目前变得非常简单和清爽:

    for(int i = 0; i < 30; i++)
      bin.addElement(
        Trash.factory(
          new Info(
            (int)(Math.random() * Info.MAX_NUM),
            Math.random() * 100)));

我们在这里成立了一个Info对象,用于将数据传入factory();后者在内存堆中成立某种Trash对象,并返回增添到Vector bin内的句柄.当然,假如改变了参数的数目及范例,仍旧需求改正这个语句.但假定Info对象的成立是自动举行的,也可以避免那个麻烦.比方,可将参数的一个Vector传送到Info对象的构建器中(或直接传入一个factory()调用).这要求在运行期间对参数(自变量)举行解析与查抄,但确切供应了非常高的机动程度.
大家从这个代码可看出Factory要负责办理的“领头改变”问题:假如向系统增添了新范例(发生了改变),唯一需求改正的代码在Factory内部,所以Factory将那种改变的影响断绝出来了.
  以上是“"制作更多的对象"[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • XP系统拜候局域网计算机时提醒"回绝拜候"的办理办法
  • Windows 8 系统提醒"已禁用 IME"会对系统利用有什么影响
  • Windows 8 中找回"便笺"小工具和程序的办法(图)
  • Windows 8 中"便笺"小工具和程序不见了若何处理
  • IE浏览器弹出对话框"您计算机某程序已破坏"怎么办理?
  • 办理内存不能为"read"指令00000000*0的问题
  • Windows7的优化本领之启动"高性能"设置(图文教程)
  • Win7安装VirtualBox提醒"Installation failed!Error:系统找不到指定的途径"的缘由及
  • 巧用Win7的"属性"功效 办理常用小问题的办法
  • 关闭迅雷"XLServicePlatform"服务 避免招致Win8假死的办法
  • Win7中无法成立文件‘新建 库.library-ms’文件系统错误(16389)"若何办理
  • SQL Server 2008 Express 安装或卸载时提醒"重启计算机失利"的办理办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .