worldwind学习笔记-10-T T 工厂模式这么用啊

原创 2013年12月04日 14:46:46

我了个去,我写的这个学习笔记根本不能看啊,啰嗦,而且抓不住重点,这章我想说我学到的所谓的针对接口的编程,似乎叫做面向接口编程吧。

ApplicationTemplate里面的AppPanel和AppFrame不复杂,但是个人认为他有些东西在本章还用不到,最好不要这么多。

所以,转看HelloWorldWind,比较简单的几行代码,一个main里面启动了内部类AppFrame,然后AppFrame里面设定自己的关闭方式是退出。

WorldWindowGLCanvas是个重量级的awt组件,可以和轻量级组件混合使用,所以他用jframe去添加WorldWindowGLCanvas对象是没有问题的,不过,在《Java2图形设计 卷2 SWING》一书中,开篇就在阐述两者区别,其中层序问题很重要,因为轻量级组件的层序和他的容器相同,重量级组件如果加在轻量级组件容器上方,所有该容器的轻量级组件都会被覆盖,所以WWj的示例源码里,有些有目录的(如KMLViewer),点击目录,内容是被盖掉的。(java 1.7的后面的版本把这个修复了)

WorldWindowGLCanvas=>GLCanvas=>Canvas=>Component,所以他是awt的组件。

getCaps方法是用来初始化OpenGL性能的,DepthBits是位深,就是平时我们所说的16色增强色,24色真彩色等,不过为何我设置之后仍旧不影响实际效果,我就不知道了。

然后。。神奇的代码出现了:((WorldWindowGLDrawable) WorldWind.createConfigurationComponent(AVKey.WORLD_WINDOW_CLASS_NAME));

WorldWindowGLDrawable是一个接口,要实现三个方法,他们使用createConfigurationComponent来产生对象,String gov.nasa.worldwind.avlist.AVKey.WORLD_WINDOW_CLASS_NAME = "gov.nasa.worldwind.avkey.WorldWindowClassName" 这是后面AVkey对应的值,曾经阅读大话设计模式的时候,我就被逼疯过,我完全不理解为何要有工厂模式,简单工厂模式,虚拟工厂模式等,他无非就是给new套上了外衣,代码量没少,所谓的功能增加方便,还是要去修改这里的代码,并且还要再写实现类,他将代码变得更复杂但是我并没有体会到他的好处。

我在我们程序的数据库连接类那里用了一次这种设计模式,一个IDB接口,一个DBFactory来构造,对sqlserver,oracle,access写了三种实现,可是由于jdbc使用的sql语句会略有不同,比如时间对比,sqlserver可以用between '2013-12-5' and '2013-12-6' 但是access就要写成between #2013-12-5# and #2013-12-6#,我虽然封装了支持类,但是真正实现的时候,(╯‵□′)╯︵┻━┻仍旧蛋疼的要写不同的sql语句啊,╮(╯_╰)╭让我觉得构造模式没有让我的代码更出彩或者更易懂更好维护。

不过看到wwj的代码,我明白了,这真是神奇的东西,原来还有类加载器这一说,我读java核心编程基础知识时,有这么一章,我当想说看了下,并没有去敲敲代码,而且我也不觉得我会去构造工具,而书上说如果对构造工具没兴趣,可以跳过本节。。。。我当时跳过去了啊,最后还是要返回来读。

wwj利用Class的反射能力,构造了一个不太一样的工厂。

/**
     * @param classNameKey the key identifying the component
     *
     * @return the new component
     *
     * @throws IllegalStateException    if no name could be found which corresponds to <code>classNameKey</code>
     * @throws IllegalArgumentException if <code>classNameKey<code> is null
     * @throws WWRuntimeException       if the component could not be created
     */
    public static Object createConfigurationComponent(String classNameKey)
        throws IllegalStateException, IllegalArgumentException
    {
        if (classNameKey == null || classNameKey.length() == 0)
        {
            Logging.logger().severe("nullValue.ClassNameKeyNullZero");
            throw new IllegalArgumentException(Logging.getMessage("nullValue.ClassNameKeyNullZero"));
        }

        String name = Configuration.getStringValue(classNameKey);
        if (name == null)
        {
            Logging.logger().log(Level.SEVERE, "WorldWind.NoClassNameInConfigurationForKey", classNameKey);
            throw new WWRuntimeException(
                Logging.getMessage("WorldWind.NoClassNameInConfigurationForKey", classNameKey));
        }

        try
        {
            return WorldWind.createComponent(name.trim());
        }
        catch (Throwable e)
        {
            Logging.logger().log(Level.SEVERE, "WorldWind.UnableToCreateClassForConfigurationKey", name);
            throw new IllegalStateException(
                Logging.getMessage("WorldWind.UnableToCreateClassForConfigurationKey", name), e);
        }
    }
Configuration在上节中提到了,是一个单例模式的,所以他提供了整个系统的核心级配置。

而他又在AVKey中定义了大量的Key值,这些Key值存储在配置文件中当name用,value才是真类名,绕了这么一圈,就是为了能让代码成为一种插入式代码,只需要修改配置文件,然后在jar同目录下提供好class文件或者打好的jar包,就能让jvm的类加载器去找这个类,并且产生该类的对象。

所以代码最终导致:WorldWindowGLDrawable这个接口的实现类是:gov.nasa.worldwind.WorldWindowGLAutoDrawable

这里有一段我不太明白的继承树

WorldWindowGLAutoDrawable=》WorldWindowImpl=》WWObjectImpl=》AVListImpl

这一系列的集成难道只是为了支持javabean吗。

在通过构造器产生了WorldWindowGLDrawable的实例后,还需要给他做些设置,就是初始化绘图,初始化Gpu的数据。

紧接着,作为WorldWindowGLCanvas这个重量级画布,他还实现了View和InputHandel两个东西,

View也是通过构造器产生的,是gov.nasa.worldwind.avkey.ViewInputHandlerClassName。

InputHandel也是通过构造器产生的,是gov.nasa.worldwind.awt.AWTInputHandler

这种方式,就保证了这部分的代码都是面向接口的编写,调用的也是面向接口的方法,当需要显示非地球的东西,或者对view进行扩充,都只需要增加一个类,然后修改配置文件就可以了,工厂模式这么用,真的让我觉得,模式白学了。

在他们的Design and Coding Guidelines里面也推荐了几本书,Core Java,The Java programming Language等,并且他说他们读了一遍又一遍,看来,我也需要大量的阅读和写代码,才能有这样子的高端视角。才能更好的设计我的程序和代码,让他更健壮更强大。

版权声明:本文为博主原创文章,未经博主允许不得转载。

开源三维GIS软件WorldWind学习手记(一):WorldWind一览

开源三维GIS软件WorldWind学习手记(一):WorldWind一览粟卫民http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2008-1-1...
  • suen
  • suen
  • 2008年01月18日 16:34
  • 8140

worldwindjava的特点

翻译自:http://goworldwind.org/features/ 特点 世界风能丰富的功能提供了用于显示和与地理数据交互和较广泛的几何对象。 一般特点 开源...
  • xuwqcug
  • xuwqcug
  • 2011年09月21日 17:57
  • 783

WorldWind瓦片调度策略说明

本文结合源码分析介绍了WorldWind中的瓦片调度策略。
  • free1985
  • free1985
  • 2017年08月21日 09:09
  • 2207

python 正则表达式分析,终于不是和看天书一样了。

1. Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2. re模块的基本函数...
  • u012323100
  • u012323100
  • 2013年11月20日 16:46
  • 1451

WordWind(Java版)开发环境搭建

首先在官网下载最新的WordWind源码文件,解压缩,然后在Eclipse中新建Java Project。 如果想对WorldWind源码进行研究,开发环境搭建如下: 1.将下载的文件中的src文件夹...
  • T_27080901
  • T_27080901
  • 2014年03月02日 22:23
  • 2999

Java版WorldWind中加入会运动模型

在worldwind sdk中的gov.nasa.worldwind.geom,这个包是存放一些几何模型的。 我使用的是球类Sphere,它是使用OpenGL画出来的。 参考这个类进行了一定的修改...
  • u012712257
  • u012712257
  • 2015年03月31日 17:05
  • 859

九、WorldWindJava2.0加载影像问题

WorldWindJava2.0
  • suhu_1234
  • suhu_1234
  • 2015年12月17日 13:37
  • 1100

基于C#开发的WorldWind1.4环境配置

作为WorldWind小白,最初就是到网上看看入门级的资料,参考http://www.cnblogs.com/wuhenke/archive/2009/12/09/1620545.html,感谢无痕客...
  • shibing624
  • shibing624
  • 2014年03月25日 21:37
  • 950

一、WorldWindJava2.0使用

worldwindjava2.0
  • suhu_1234
  • suhu_1234
  • 2015年12月02日 16:24
  • 1431

World Wind学习总结一

 WW的纹理,DEM数据,及LOD模型以earth为例1. 地形数据:默认浏览器纹理数据存放在/Cache/Earth/Images/NASA Landsat Imagery/NLT Landsat7...
  • paul_xj
  • paul_xj
  • 2007年08月27日 09:12
  • 8930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:worldwind学习笔记-10-T T 工厂模式这么用啊
举报原因:
原因补充:

(最多只允许输入30个字)