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

上一次我们讨论了工厂方法模式,我们知道,在工厂方法模式中,我们每创建一个新的实体类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();
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值