Java设计模式——抽象工厂模式

⚪抽象工厂模式(Abstract Factory)是一种创建型设计模式,这个模式涉及到一个抽象工厂类,它有多个子类工厂,每个子类工厂负责创建一组相关的产品。

⚪意图:它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体类。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

  1. 抽象工厂(Abstract Factory):定义了创建一组相关产品的接口。它包含多个创建产品的抽象方法,每个方法对应一个具体产品工厂。

  2. 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建一组相关产品。每个具体工厂对应一个产品族。

  3. 抽象产品(Abstract Product):定义了产品对象的接口,包括产品的属性和方法。

     

  4. 具体产品(Concrete Product):实现了抽象产品接口,是具体的产品对象。

        ▷ 工作流程

  1. 定义抽象工厂接口,其中包括一组抽象方法,每个方法用于创建一个产品。

  2. 创建具体工厂类,实现抽象工厂接口,并在每个方法中返回具体产品的实例。

  3. 定义抽象产品接口,包括产品的属性和方法。

  4. 创建具体产品类,实现抽象产品接口,提供具体产品的实现。

  5. 在客户端代码中,选择适当的具体工厂类,然后使用该工厂创建产品对象。

        ▷ 示例

// 抽象工厂接口
interface UIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂类 - Windows UI
class WindowsUIFactory implements UIFactory {
    public Button createButton() {
        return new WindowsButton();
    }

    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂类 - macOS UI
class MacOSUIFactory implements UIFactory {
    public Button createButton() {
        return new MacOSButton();
    }

    public TextField createTextField() {
        return new MacOSTextField();
    }
}

// 抽象产品接口
interface Button {
    void render();
    void onClick();
}

interface TextField {
    void render();
    String getText();
}

// 具体产品类 - Windows UI
class WindowsButton implements Button {
    // 实现 Windows 风格按钮的方法
}

class WindowsTextField implements TextField {
    // 实现 Windows 风格文本框的方法
}

// 具体产品类 - macOS UI
class MacOSButton implements Button {
    // 实现 macOS 风格按钮的方法
}

class MacOSTextField implements TextField {
    // 实现 macOS 风格文本框的方法
}

⚪适用性

  1. 一个系统要独立于它的产品的创建、组成和表示时。
  2. 一个系统要由多个产品系列中的一个来配置时。
  3. 当要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 当提供一个产品库类,只想显示它们的接口而不是实现时。

应用场景

  1. 系统需要一组相关的产品对象,并且这些产品对象之间存在一定的约束或依赖关系,例如,同一种类型的按钮和文本框在不同操作系统下有不同的外观,但它们必须一起使用。

  2. 客户端代码需要与多个产品族中的一个交互,但是不希望依赖于具体产品的类。

  3. 它只关心与产品接口交互。系统的产品族经常变化,但是客户端代码不应随之变化。

⚪实际已有场景

  1. Swing GUI 框架:Swing 是 Java 的图形用户界面工具包,它使用抽象工厂模式来创建不同外观(Look and Feel)的用户界面元素,如按钮、文本框等。每个外观对应一个具体工厂类,负责创建该外观下的所有 UI 组件。

  2. 数据库访问:在数据库访问中,抽象工厂模式可以用来创建数据库连接对象、命令对象等,以便在不同数据库(如MySQL、Oracle)之间切换时能够轻松切换数据库操作。
  3. Bean 工厂:Spring 的 Bean 工厂(例如,org.springframework.beans.factory.BeanFactory)可以被视为工厂模式的一种实现,它负责创建和管理各种类型的 Bean 对象。 

  4. 应用上下文:Spring 应用上下文(例如,org.springframework.context.ApplicationContext)扩展了 Bean 工厂,提供了更多的功能,包括依赖注入、事件传播等。这也可以看作是工厂模式的一种变体,用于创建和管理应用程序中的对象。
 
posted @ 2023-10-03 22:51  xiaogh  阅读(106)  评论(0)    收藏  举报