前面说过了,在Java类库中设计模式的踪影随处可见,因而要讲解所有出现的模式
实在是不可能,这儿主要把焦点聚集在AWT/Swing中,管中窥豹,却也可以了解设计模式
的一些深刻的含义所在。
2.3 AbstractFactory模式和视感(3月13日)
前面介绍过工厂方法模式,这儿又来了一个抽象工厂模式。这两个模式大同小异,
所以有时候会一起略称为工厂模式。与工厂方法模式不同,抽象工厂模式要做的,不仅
仅是创建一个对象,而是创建一系列相关的对象群。
在最新的Swing组件中支持视感(Look and Feel)的概念,也就是说,一个程序可
以有多个不同的外观,而且它是集成在类库中的,实现起来毫不费劲。确实是一件非常
令人感到欣喜的事情,可能下面的这条语句你已经见过N遍了:
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
只需要这么简单的一条语句,就可以改变整个程序的外观,真的怎一个爽字了得。
Swing的多视感的组件,实际上就是多个系列的不同外观感觉(也由部分操作不一样
)组件对象群。这多个系列继承了同一个抽象接口,我们在编程的时候,只需要按照这
个接口编程,就可以使程序不需任何变动,而在多个视感之间动态的切换。而Swing是如
何实现这些不同的视感组件的创建的呢?它借助了AbstractFactory模式。AbstractFac
tory模式提供了一个创建一系列相关或相互依赖对象的接口,而无须指定指定它们具体
的类。我们来看一看AbstractFactory模式的类图,以便更清楚的了解AbstractFactory
模式实现的细节。
这个图看起来有些费劲,我来解释一下你就明白了。
AbstractFactory提供了一个抽象的接口,来创建一个系列对象中的每个对象。在图
中可以看出它能够创建ProductA和ProductB这两个对象。这两个对象的接口是由Abstra
ctProductA和AbstractProductB这两个抽象类所定义的。AbstractFacotry的子类Concr
eteFactory1和ConcreteFactory2分别实现了AbstractFacotry中所定义的接口,每个具
体的工厂都用来创建其各自的对象群,虽然这些对象的实现各不相同,但是它们都遵循
共同的接口,也就是说,根据AbstractProductA和AbstractProductB所创建的程序,可
以完全不加修改的运行在由ConcreteFactory1或ConcreteFactory2所创建的对象群中。
具体就Swing而言,它的三个不同的视感Metal,Motif,Windows就是三类遵循了相
同接口的对象群,而每一个Swing组件就是就是这个对象群中的对象。当用户通过上面的
程序短设置了程序中要使用的视感后,就相当于创建了一个与这个视感相关的组件工厂
,当你调用类似于“aButton=new Jbutton()”这样的语句的时候,一个具有这种视感外
观的对象就被这个工厂创建并返回了。
从上面的讲解可以看到一些AbstractFactory模式的好处,首先:它分离了具体的类
,将客户与类的实现分离了,便于程序的复用。第二:它使得交换一个系列的类变得很
容易,只需要创建一个具体工厂,在由这个具体工厂生成具有同样接口的对象,而程序
不需要任何的改动!
上面我们提到对等体的创建也利用到了AbstractFactory模式,现在你因该搞得清楚
对等体是如何被创建了的吧。