Java与设计模式(03)--抽象工厂模式

来源:互联网 发布:精易编程助手网页抓包 编辑:程序博客网 时间:2024/06/15 10:23

上一次我们讨论了工厂方法模式,我们知道,在工厂方法模式中,我们每创建一个新的实体类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 {@Overridepublic void draw() {System.out.println("Win7 Button Draw...");}}

Win7TextField

public class Win7TextField extends TextField {@Overridepublic void draw() {System.out.println("Win7 TextField Draw...");}}

WinXPButton

public class WinXPButton extends Button {@Overridepublic void draw() {System.out.println("WinXP Button Draw...");}}

WinXPTextField

public class WinXPTextField extends TextField {@Overridepublic void draw() {System.out.println("WinXP TextField Draw...");}}

工厂类:

Theme

public interface Theme {public Button getButton();public TextField getTextField();}

Win7Theme

public class Win7Theme implements Theme {@Overridepublic Button getButton() {return new Win7Button();}@Overridepublic TextField getTextField() {return new Win7TextField();}}

WinXPTheme

public class WinXPTheme implements Theme {@Overridepublic Button getButton() {return new WinXPButton();}@Overridepublic 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();}}





原创粉丝点击