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

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

相关文章推荐

java学习笔记--工厂模式、实体关系

1.分层意识:数据访问层、业务层、表现层。数据访问层负责基本的数据访问操作,为业务层服务。 2.工厂模式:创建对象的工作由工厂对象来实现,而不是直接new对象。 3.实体关系:实体关系分类:1)继承:...

学习笔记_抽象工厂模式

抽象工厂模式,在很多场景下都有应用。   它有以下的优点 1:封装性,每个产品的实现类不是高层模块要关心的,它所要关心 的是接口和抽象类,他不关心对象是如何创建出来,只有工厂类去关心...

HeadFirst学习笔记2:抽象工厂模式

抽象工厂方法中,之所以出现CheesePizza这个类,是因为工厂中pizza的馅料不同而已,不管是NY还是chicago制作cheesePizza的方法一样。这种馅料的差异放到了原料工厂去处理,完全...
  • NEOMc
  • NEOMc
  • 2011年09月14日 13:17
  • 868

工厂模式学习笔记

工厂方法模式(Factory Pattern)是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你不知道,但是你已经使用了无数次改模式了。例如Activity中...
  • siguoyi
  • siguoyi
  • 2016年08月04日 17:12
  • 203

学习笔记_简单工厂模式

举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。 女...

抽象工厂模式——学习笔记

1.抽象工厂模式——是对产品角色的抽象,面对的问题是多个产品等级结构的系统设计,这是与工厂方法模式最大的区别(工厂方法模式面对的是一个产品等级结构),如果使用多个工厂方法模式来实现,会导致相似的工厂方...

Java学习笔记之工厂模式

一、什么是工厂模式工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。工...

简单工厂模式学习笔记

最近开始看点设计模式,由于我这人脑袋有点笨所以简单工厂模式也是看了几遍才慢慢领悟点意思出来。所以在这里记录下来好日后翻阅。 简单工厂模式又叫做静态工厂方法(StaticFactory Method)...

Java学习笔记----工厂模式和反射

C#课上老师讲的工厂模式和反射,做了些笔记,课下自己结合JAVA,再复习一次工厂模式还有反射。 工厂模式,顾名思义,工厂是负责生产产品的。我们把代码分成两大块,一块是工厂,一块是客户。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:worldwind学习笔记-10-T T 工厂模式这么用啊
举报原因:
原因补充:

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