您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java设计模式中抽象工厂的定义及代码演示
## 一、抽象工厂模式概述
### 1.1 模式定义
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种封装一组具有共同主题的独立工厂的方式,而无需指定它们的具体类。该模式允许客户端使用抽象的接口来创建一系列相关或依赖对象,而无需关心实际创建的具体实现。
**核心特征**:
- 围绕一个超级工厂创建其他工厂
- 工厂的工厂(Factory of factories)
- 生产相关对象族(产品家族)
### 1.2 模式结构
抽象工厂包含以下主要角色:
| 角色 | 说明 |
|---------------------|----------------------------------------------------------------------|
| AbstractFactory | 声明创建抽象产品对象的操作接口 |
| ConcreteFactory | 实现创建具体产品对象的操作 |
| AbstractProduct | 为一类产品对象声明接口 |
| ConcreteProduct | 定义将被具体工厂创建的产品对象,实现AbstractProduct接口 |
| Client | 仅使用由AbstractFactory和AbstractProduct类声明的接口 |
### 1.3 适用场景
- 系统需要独立于其产品的创建、组合和表示时
- 系统需要配置多个产品族中的一个来使用时
- 需要提供一个产品类库,且只想显示它们的接口而非实现时
- 一系列相关的产品对象设计为一起使用,且需要保证这一约束时
## 二、模式实现原理
### 2.1 UML类图
```mermaid
classDiagram
class AbstractFactory {
<<interface>>
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class ConcreteFactory1 {
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class ConcreteFactory2 {
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}
class AbstractProductA {
<<interface>>
+operationA() String
}
class ProductA1 {
+operationA() String
}
class ProductA2 {
+operationA() String
}
AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractProductA <|-- ProductA1
AbstractProductA <|-- ProductA2
ConcreteFactory1 --> ProductA1
ConcreteFactory2 --> ProductA2
// 抽象产品接口
interface AbstractProductA {
String operationA();
}
interface AbstractProductB {
String operationB();
}
// 具体产品实现
class ConcreteProductA1 implements AbstractProductA {
public String operationA() {
return "Product A1 operation";
}
}
class ConcreteProductB1 implements AbstractProductB {
public String operationB() {
return "Product B1 operation";
}
}
// 抽象工厂接口
interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
// 具体工厂实现
class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
假设我们需要开发一个跨平台的UI组件库,需要支持Windows和Mac两种风格: - 按钮(Button) - 文本框(TextField) - 复选框(Checkbox)
// 抽象产品接口
interface Button {
void render();
void onClick();
}
interface TextField {
void render();
String getText();
}
interface Checkbox {
void render();
boolean isChecked();
}
// Windows系列产品
class WindowsButton implements Button {
public void render() {
System.out.println("Render Windows style button");
}
public void onClick() {
System.out.println("Windows button clicked");
}
}
class WindowsTextField implements TextField {
public void render() {
System.out.println("Render Windows style text field");
}
public String getText() {
return "Windows text field content";
}
}
class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("Render Windows style checkbox");
}
public boolean isChecked() {
return true;
}
}
// Mac系列产品
class MacButton implements Button {
public void render() {
System.out.println("Render Mac style button");
}
public void onClick() {
System.out.println("Mac button clicked");
}
}
class MacTextField implements TextField {
public void render() {
System.out.println("Render Mac style text field");
}
public String getText() {
return "Mac text field content";
}
}
class MacCheckbox implements Checkbox {
public void render() {
System.out.println("Render Mac style checkbox");
}
public boolean isChecked() {
return false;
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
Checkbox createCheckbox();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public TextField createTextField() {
return new WindowsTextField();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public TextField createTextField() {
return new MacTextField();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
// 客户端代码
public class Application {
private Button button;
private TextField textField;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
textField = factory.createTextField();
checkbox = factory.createCheckbox();
}
public void renderUI() {
button.render();
textField.render();
checkbox.render();
}
public static void main(String[] args) {
// 根据配置选择工厂
GUIFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("win")) {
factory = new WindowsFactory();
} else {
factory = new MacFactory();
}
Application app = new Application(factory);
app.renderUI();
}
}
当在Windows系统运行时输出:
Render Windows style button
Render Windows style text field
Render Windows style checkbox
当在Mac系统运行时输出:
Render Mac style button
Render Mac style text field
Render Mac style checkbox
与工厂方法模式:
与单例模式:
与原型模式:
Java标准库中的应用:
流行框架中的应用:
跨平台开发:
抽象工厂模式通过提供创建相关或依赖对象族的接口,实现了: - 系统与具体产品实现的解耦 - 产品配置的灵活性 - 多系列产品的统一创建
正确使用该模式的关键在于识别系统中是否存在多个产品族,以及是否需要保证产品间的兼容性。当产品等级结构稳定时,抽象工厂模式能显著提高代码的可维护性和扩展性。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。