java设计模式中抽象工厂的定义及代码演示

发布时间:2021-09-10 16:39:19 作者:chen
来源:亿速云 阅读:149
# 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

2.2 核心代码结构

// 抽象产品接口
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();
    }
}

三、完整代码示例

3.1 场景描述

假设我们需要开发一个跨平台的UI组件库,需要支持Windows和Mac两种风格: - 按钮(Button) - 文本框(TextField) - 复选框(Checkbox)

3.2 实现代码

// 抽象产品接口
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();
    }
}

3.3 运行结果

当在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

四、模式优缺点分析

4.1 优点

  1. 产品族一致性:保证客户端始终只使用同一个产品族中的对象
  2. 解耦具体类:将具体类的实例化过程与客户端代码分离
  3. 易于交换产品系列:只需改变具体工厂即可使用不同的产品配置
  4. 符合开闭原则:新增产品族时无需修改已有代码

4.2 缺点

  1. 扩展产品等级困难:添加新产品需要修改抽象工厂接口及所有实现
  2. 增加了系统复杂性:引入了许多接口和类
  3. 过度设计风险:不适合产品等级结构经常变化的场景

五、与其他模式的关系

  1. 与工厂方法模式

    • 抽象工厂通常通过一组工厂方法实现
    • 工厂方法是创建单一产品,抽象工厂是创建产品族
  2. 与单例模式

    • 具体工厂通常实现为单例
  3. 与原型模式

    • 抽象工厂可以使用原型模式来初始化产品对象

六、实际应用案例

  1. Java标准库中的应用

    • javax.xml.parsers.DocumentBuilderFactory
    • java.sql.Connection
  2. 流行框架中的应用

    • Spring框架中的BeanFactory
    • JavaFX中的Skin类
  3. 跨平台开发

    • 如上述示例的GUI组件
    • 游戏开发中的不同场景资源加载

七、总结

抽象工厂模式通过提供创建相关或依赖对象族的接口,实现了: - 系统与具体产品实现的解耦 - 产品配置的灵活性 - 多系列产品的统一创建

正确使用该模式的关键在于识别系统中是否存在多个产品族,以及是否需要保证产品间的兼容性。当产品等级结构稳定时,抽象工厂模式能显著提高代码的可维护性和扩展性。 “`

推荐阅读:
  1. PHP 选择排序法代码演示
  2. java设计模式的抽象工厂模式怎么写

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Python如何实现生成验证码的功能

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》