注:这里的设计模式引用自林信良java 学习笔记。相关内容属于原作者所有,这里只是为了学习,进行转载和相应小修改。
AbstractFactory 模式将具体的 Product 实现封装到具体的 Factory 实现中,而客户只依赖于 Product 和 Factory 的接口(Interface),避免依赖于 Product 和 Factory 的具体实现类,由于 Factory 封装了所需的 Product, 要更换所有的 Product ,只需要简单的更换 Factory 就可以了,不需要更改客户代码。
Abstract Factory 的UML 图如下所示:
例如:编写一个 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 类图图下所示:
[img]http://farm1.static.flickr.com/151/429004435_b80bd36252.jpg?v=0
[/img]
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();
}
}
分享到:
相关推荐
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
创建型模式如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory),主要关注对象的创建过程,旨在减少类之间的耦合度。结构型模式如适配器模式(Adapter)、装饰器模式...
C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式(3) - 设计原则(2) C#设计模式(2) - 设计原则(1) C#设计模式(1) - ...
抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
### 设计模式——Abstract Factory模式的认识 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决在软件设计过程中常见的问题。其中,Abstract Factory模式是23种GoF(Gang of Four)设计模式之一,它...
Java 设计模式 - Abstract Factory Abstract Factory 是一种创建型模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个模式的主要优点是客户类和工厂类分开,客户类可以无需修改...
在设计模式中,Abstract Factory模式是一种用来解决在不指定具体实现的情况下创建一系列相关或相互依赖对象的模式。在本文的上下文中,我们看到它被应用于一个奇幻RPG游戏的角色种族设计,每个种族(如人类、精灵)...
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...
这类模式关注对象的创建过程,包括单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们提供了创建对象的不同策略,使代码更加灵活...
Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...
"设计模式-UML类图" 设计模式是软件开发中的一种解决方案,它提供了一种通用的解决方案来解决软件设计中常见的问题。UML(Unified Modeling Language)是一种标准化的建模语言,用于描述软件系统的结构和行为。下面...
工厂方法模式是面向对象设计模式中的一个创建型模式,它提供了一种封装对象创建过程的方式,使得具体的对象创建过程可以延迟到子类中进行。在C++编程中,工厂方法模式广泛应用于各种软件设计中,因为它能有效地解耦...
创建型模式主要关注对象的创建过程,比如单例模式(Singleton)、工厂模式(Factory)和抽象工厂模式(Abstract Factory)。它们提供了一种在不指定具体类的情况下创建对象的方法,增加了代码的灵活性和可扩展性。 ...
- **AbstractFactory**:声明创建抽象产品对象的操作接口。 - **ConcreteFactory**:实现创建具体产品对象的操作。 - **AbstractProduct**:为一类产品对象声明接口。 - **ConcreteProduct**:由相应具体工厂创建的...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory),它们旨在提供一种创建对象的最佳方式,同时保持系统的灵活性和扩展性。结构型模式涉及...