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

来源:互联网 发布:常州淘宝模特兼职 编辑:程序博客网 时间:2024/06/13 06:35

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

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来产生对象,Stringgov.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等,并且他说他们读了一遍又一遍,看来,我也需要大量的阅读和写代码,才能有这样子的高端视角。才能更好的设计我的程序和代码,让他更健壮更强大。

原创粉丝点击