lokvin 发表于 2013-1-28 13:15:04

设计模式 -

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

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

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

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

CustomDialog 的代码如下:
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 ...");}}

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

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

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


CustomDialogNew 类
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...");}}

IWidgetFactory 接口

package org.lokvin.example.designpattern.abstractfactory;/** * IWidgetFactory 抽象工厂接口 * @author lokvin * */public interface IWidgetFactory {public IButton getButton();public ITextField getTextField();}

IButton 接口

package org.lokvin.example.designpattern.abstractfactory;/** * IButton 接口 * @author lokvin * */public interface IButton {public void paintButton();}

ITextField 接口
package org.lokvin.example.designpattern.abstractfactory;/** * ITextField 接口 * @author lokvin * */public interface ITextField {public void paintTextField();}

MacButton 类

package org.lokvin.example.designpattern.abstractfactory;public class MacButton implements IButton {public void paintButton() {System.out.println("Mac button paint ...");}}

MacTextField 类

package org.lokvin.example.designpattern.abstractfactory;public class MacTextField implements ITextField {public void paintTextField() {System.out.println("Mac textField paint...");}}


WindowsButton 类

package org.lokvin.example.designpattern.abstractfactory;public class WindowsButton implements IButton {public void paintButton() {System.out.println("Windows Button paint... ");}}


WindowsTextField 类

package org.lokvin.example.designpattern.abstractfactory;public class WindowsTextField implements ITextField {public void paintTextField() {System.out.println("paint windows textField...");}}

MacWidgetFactory 类

package org.lokvin.example.designpattern.abstractfactory;public class MacWidgetFactory implements IWidgetFactory {public IButton getButton() {return new MacButton();}public ITextField getTextField() {return new MacTextField();}}

WindowsWidgetFactory 类

package org.lokvin.example.designpattern.abstractfactory;public class WindowsWidgetFactory implements IWidgetFactory {public IButton getButton() {return new WindowsButton();}public ITextField getTextField() {return new WindowsTextField();}}
页: [1]
查看完整版本: 设计模式 -