设计模式 -- Abstract Factory

[b]注:这里的设计模式引用自林信良java 学习笔记。相关内容属于原作者所有,这里只是为了学习,进行转载和相应小修改。[/b]

AbstractFactory 模式将具体的 Product 实现封装到具体的 Factory 实现中,而客户只依赖于 Product 和 Factory 的接口(Interface),避免依赖于 Product 和 Factory 的具体实现类,由于 Factory 封装了所需的 Product, 要更换所有的 Product ,只需要简单的更换 Factory 就可以了,不需要更改客户代码。

Abstract Factory 的UML 图如下所示:
[img]http://farm1.static.flickr.com/187/429004230_4a5cbf74b3.jpg?v=0[/img]

例如:编写一个 Dialog 对话框,我们希望对话框拥有不同的感官 (look and feel),最基本的想法是通过 setter 方法将不同的感官元件附给对话框。

CustomDialog 的代码如下:
[code]
package org.lokvin.example.designpattern.abstractfactory;

/**
* CustomDialog 类
* 他依赖于 IButtion 和 ITextField
* 通过 setter 方法可以更换 IButton 和 ITextField 的实现
* @author lokvin
*
*/
public class CustomDialog {
private IButton button;
private ITextField textField;

public void setButtion(IButton button) {
this.button = button;
}

public void setTextField(ITextField textField) {
this.textField = textField;
}

public void layoutAllComponents() {

}

public void showDialog() {
this.paintDialog();
button.paintButton();
textField.paintTextField();
}

public void paintDialog() {
System.out.println("custom dialog paint ...");
}
}

[/code]

这是个基本的接口依赖,CustomDialog 类指依赖 IButton 和 ITextField 接口,和他们具体实现类无关,同过调用相应 setter 方法设置不同的 IButton 和 ITextField 实现就可以变换不同的 look and feel , 但上面的实现需要亲自调用 setter 和 layout 等方法。我们希望感官更换更简单些,只更换一个元件就完成 Dialog 对话框上所有元件感官的更换。

我们使用 Abstract Factory 模式,将对话框所要产生的元件加以封装,对话框依赖于Abstract Factory , 具体的 Factory 实现产生对话框所需感官元件的实现。

UML 类图图下所示:
[img]http://farm1.static.flickr.com/151/429004435_b80bd36252.jpg?v=0
[/img]

CustomDialogNew 类
[code]
package org.lokvin.example.designpattern.abstractfactory;

/**
* CustomDialogNew 类,它依赖于抽象工厂 IWdigetFactory 接口
* 和 IButton ,ITextField 接口
* @author lokvin
*
*/
public class CustomDialogNew {
private IButton button;
private ITextField textField;

public CustomDialogNew(IWidgetFactory widgetFactory) {
setWidgetFactory(widgetFactory);
}

//客户端只依赖于 抽象工厂接口 IWidgetFactory, 与工厂具体实现无关
//更换工厂实现不需要更改客户端代码
public void setWidgetFactory(IWidgetFactory widgetFactory) {
setButton(widgetFactory.getButton());
setTextField(widgetFactory.getTextField());
}

public void layoutAllComponents() {

}

public void setButton(IButton button) {
this.button = button;
}

public void setTextField(ITextField textField) {
this.textField = textField;
}

public void showDialog() {
this.paintDialog();
button.paintButton();
textField.paintTextField();
}

public void paintDialog() {
System.out.println("custom dialog paint...");
}
}

[/code]

IWidgetFactory 接口

[code]
package org.lokvin.example.designpattern.abstractfactory;

/**
* IWidgetFactory 抽象工厂接口
* @author lokvin
*
*/
public interface IWidgetFactory {
public IButton getButton();
public ITextField getTextField();

}

[/code]

IButton 接口

[code]
package org.lokvin.example.designpattern.abstractfactory;

/**
* IButton 接口
* @author lokvin
*
*/
public interface IButton {
public void paintButton();

}

[/code]

ITextField 接口
[code]
package org.lokvin.example.designpattern.abstractfactory;

/**
* ITextField 接口
* @author lokvin
*
*/
public interface ITextField {
public void paintTextField();
}

[/code]

MacButton 类

[code]

package org.lokvin.example.designpattern.abstractfactory;

public class MacButton implements IButton {

public void paintButton() {
System.out.println("Mac button paint ...");
}

}
[/code]

MacTextField 类

[code]
package org.lokvin.example.designpattern.abstractfactory;

public class MacTextField implements ITextField {
public void paintTextField() {
System.out.println("Mac textField paint...");
}

}
[/code]


WindowsButton 类

[code]
package org.lokvin.example.designpattern.abstractfactory;

public class WindowsButton implements IButton {
public void paintButton() {
System.out.println("Windows Button paint... ");
}
}

[/code]


WindowsTextField 类

[code]

package org.lokvin.example.designpattern.abstractfactory;

public class WindowsTextField implements ITextField {

public void paintTextField() {
System.out.println("paint windows textField...");
}


}
[/code]

MacWidgetFactory 类

[code]

package org.lokvin.example.designpattern.abstractfactory;

public class MacWidgetFactory implements IWidgetFactory {
public IButton getButton() {
return new MacButton();
}

public ITextField getTextField() {
return new MacTextField();
}
}
[/code]

WindowsWidgetFactory 类

[code]

package org.lokvin.example.designpattern.abstractfactory;

public class WindowsWidgetFactory implements IWidgetFactory {

public IButton getButton() {
return new WindowsButton();
}
public ITextField getTextField() {
return new WindowsTextField();
}

}

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值