上一次我们讨论了工厂方法模式,我们知道,在工厂方法模式中,我们每创建一个新的实体类XXXCar,都对应一个XXXCarFactory,在使用的时候直接使用XXXCarFactory的produce方法创建对应的XXXCar对象。
接下来我们讨论抽象工厂模式。我们考虑一下窗口管理器的一个问题:
对于每种界面风格,窗口管理器(WindowManager)需要对其中的某个控件(Component)提供一种绘制方法(draw)。于是我们有了如下的类图:
从以上我们能够看到,我们的程序结构中有如下几种类型:
- 抽象的UIComponent接口,定义了draw()方法;
- 具体的XXXButton和XXXText类,实现了不同的draw()方法体;
- 抽象的Theme接口,定义了getButton和getText方法;
- 具体的Win7Theme和WinXPTheme类,实现了不同的getXXX方法;
完整的代码基本如下:
Component
public interface Component {
public void draw();
}
Button
public abstract class Button implements Component {
public abstract void draw();
}
TextField
public abstract class TextField implements Component {
public abstract void draw();
}
Win7Button
public class Win7Button extends Button {
@Override
public void draw() {
System.out.println("Win7 Button Draw...");
}
}
Win7TextField
public class Win7TextField extends TextField {
@Override
public void draw() {
System.out.println("Win7 TextField Draw...");
}
}
WinXPButton
public class WinXPButton extends Button {
@Override
public void draw() {
System.out.println("WinXP Button Draw...");
}
}
WinXPTextField
public class WinXPTextField extends TextField {
@Override
public void draw() {
System.out.println("WinXP TextField Draw...");
}
}
工厂类:
Theme
public interface Theme {
public Button getButton();
public TextField getTextField();
}
Win7Theme
public class Win7Theme implements Theme {
@Override
public Button getButton() {
return new Win7Button();
}
@Override
public TextField getTextField() {
return new Win7TextField();
}
}
WinXPTheme
public class WinXPTheme implements Theme {
@Override
public Button getButton() {
return new WinXPButton();
}
@Override
public TextField getTextField() {
return new WinXPTextField();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Theme theme = new Win7Theme();
Component button = theme.getButton();
Component text = theme.getTextField();
button.draw();
text.draw();
}
}