动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.用Spring更好地处理Struts动作三.
.带图片的,多列的DropDownList的.
.利用EJB 3.0的JPA设计企业应用程.
.JAVA经典实例--连接字符串.
.运用 DBUnit 进行高效的单元测试.
.开始学习Swing.
.关于JCreator Pro 3.0的一个折中.
.在Java中保留Stereotype.
.开发手机游戏的一点心得(二).
.struts构建文件上传(八).
.Java算术运算符.
.浅析Java中Data类的应用.
.让界面更加绚丽 Java SE 6.0四种.
.教你如何妙用EditPlus 配置Java编.
.Java性能的优化(下).
.递归删除与给定的文件名不符的文.
.Sun 认证 Java 程序员(SCJP).
.使用Java中的Timer和TimerTask.
.解决JAVA服务器性能问题研究分析.
.Java模式学习一、简单工厂.

多态与面向对象(二)

发表日期:2008-1-5 |



  Rhapsody是我们正在使用的一个集建模与代码产生功能于一身的工具。它有一个很突出的特点,那就是支持很多OS平台。噢,我的意思并不是说它像Java一样,有着“write once, run anywhere”的本领,事实上,您可以在Rhapsody中选择不同的目标平台,它将选择对应的编译器、连接器以输出您想要的二进制程序。
  
  从代码层面来看,Rhapsody提供了一组OS抽象基类,也就是所谓的OSAL(OS Abstract Layer),比如OMOSThread意味着一个线程、OMOSMessageQueue意味着一个消息队列、OMOSMutex意味着一个互斥量。Rhapsody的应用程序框架正是通过操纵这些抽象基类的指针,达到与OS交流的目的。
  
  对于每个具体的目标平台,Rhapsody需要从这组抽象类派生出一组具体类,并以相应平台上的API来实现基类中所声明的每一个接口。当然,假如Rhapsody不支持您想要的OS平台,而您的应用程序又偏偏想要运行于其上的话,很显然,编码的事情就得您来做。
  
  或许您会同我一样,认为它真的是不过如此。可是,请听听这个响亮的声音:
  
  “是吗?年轻人,请保持冷静。”不用说,这就是Andy!
  
  看来另有玄机。我的目光立即开始在一个叫os.h的文件中搜索,因为所有的os抽象基类就定义在这里。忽然我发现其中竟然定义有一个叫OMOSFactory的类!
  
  “Factory?什么嘛,学习操作系统时,老师怎没讲这个东西?”我开始自言自语。
  
  “什么?连这个你都不知道啊……”Andy探出头来,一脸的狐疑。
  
  这分明是激将法,我知道他想尽快将我练习成OO杀手,可也用不着这么心急嘛。继续往下看,我发现OMOSFactory的定义如下:
  
  class OMOSFactory {
  
  public:
  
       static OMOSFactory* instance();
  
  virtual OMOSMessageQueue* createOMOSMessageQueue(OMBoolean shouldGrow = TRUE, const long messageQueueSize = OMOSThread::DefaultMessageQueueSize) = 0;
  
       virtual OMOSThread* createOMOSThread(void tfunc(void *), void *param,
  
            const char* const threadName = NULL,
  
            const long stackSize = OMOSThread::DefaultStackSize) = 0;
  
       virtual OMOSMutex* createOMOSMutex() = 0;
  
       // 其它成员函数的声明
  
       ......
  
  };
  
  原来是个名副其实的对象工厂呀,也就是说,将来所有的OS对象都将通过它来创建!由于它是个抽象类,很显然它需要被派生,并由具体的派生类来完成真正的OS对象创建工作。可是,我忽然隐约觉得有些不对。
  
  “既然是个基类,为什么它没有声明一个为virtual的析构函数呢?”我嘀咕道。
  
  “你怎么老是这么多的为什么,难道当初我就是看中了你提问题的能力?”Andy总不忘给我些刺激。
  
  “除非这个类的设计者确定不会有人企图透过一个pointer-to-base去删除一个derived object。”
  
  “既然如此,那你说说客户如何来使用这个类?”Andy穷追不舍。
  
  对啊,这可是个抽象类,这就是说不可为它定义任何对象。可是现在又竟然不能动态创建一个派生类对象,同时将其地址赋值给一个类型为OMOSFactory *的指针,这该怎么办呢?
  
  忽然,我发现了static OMOSFactory* instance();这么一句,马上想到去看看这个函数的定义。在文件VxOS.cpp我找到了它:
  
  OMOSFactory* OMOSFactory::instance()
  
  {
  
       static VxOSFactory theFactory;
  
       return &theFactory;
  
  }
  
  同样,在文件NtOS.cpp中同样有它:
  
  OMOSFactory* OMOSFactory::instance(){
  
       static NTOSFactory theFactory;
  
       return &theFactory;
  
  }
  
  真相大白!不用说,VxOSFactory和NTOSFactory都是派生自OMOSFactory。事实上,针对VxWorks的OS类和工厂的定义及实现正是在VxOS.h和VxOS.cpp两个文件中;而针对Win32平台的OS类和工厂的定义及实现正是在NtOS.h和NtOS.cpp两个文件中。很显然,当客户写下
  
  OMOSFactory::instance();
  
  时,他将获得一个类型为OMOSFactory *的指针,这个指针指向一个具体的派生类对象;而且,由于这个对象是被声明为static,这表明在程序生命期间,不管上面一句被写过多少次,只会有一个工厂对象被产生。无论何时,当客户想要获取一个互斥量时,他都只需这么写:
  
  OMOSFactory::instance()->createOMOSMutex();
  
  而不用管他的程序到底想运行于哪个OS平台之上。
  
  “真是个不错的idea啊!”我发出由衷的感叹。
  
  “事实上,OMOSFactory实现了一个叫SINGLETON的设计模式。”不知何时,Andy竟然出现在我的身后,脸上似乎还带着一丝笑意,“当你保证某个类仅有一个实例,并提供一个访问它的全局访问点。你就可以使用这个模式。”
  
  “是的,您说的很对。不过我总觉得,多态的威力在这里真是发挥得淋漓尽致啊。”
  
[[The No.1 Picture.]]

  “其实这里还有一个被称作ABSTRACT FACTORY的设计模式,或许这个能给你一些启示。”说着,Andy不知从何处拿出一张小图片[1]:
  
  “你看,不管是OS对象,还是创建这些对象的工厂,客户只需与它们的抽象基类打交道。而且,要正确运用这两种模式,客户还应该使用这些基类的指针。事实上,面对以上这这样一个SINGLETON,除了这么做,你别无选择。”Andy笑了笑,转身离去
上一篇:为什么很多Java开发人员都对JCP感觉很失望 人气:468
下一篇:基于.Net的AOP实现技术 人气:573
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-13 爬爬思特新闻管理系统 v2.0 Beta1
2008-10-13 Pligg v9.9.5 Beta
2008-10-13 广优邮件发送系统 v2.1
2008-10-13 缤纷互动视频交友 v3.1 RC
2008-10-13 MyShop网络商城 build 081005
2008-10-13 Chyrp 超轻量级开源博客引擎 v2.
2008-10-13 162100静态(论坛/文章)系统 v2.4
2008-10-13 金博人才招聘求职网黄金版 v4.2
2008-10-13 愚人笔记 v4.0
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成