11.抽象工厂模式

发布时间:2024年01月09日


前言

前面我们已经介绍了简单工厂和工厂方法模式,我们先简单回顾一下

简单工厂模式

  1. 只有一个工厂类,负责创建所有产品。
  2. 所有产品的创建逻辑都在同一个工厂类中。
  3. 不符合开闭原则,当需要添加新产品时,需要修改工厂类。

工厂方法模式

  1. 引入抽象工厂接口,每个具体工厂负责创建一类产品。
  2. 每个产品有对应的工厂,符合开闭原则。
  3. 但如果有多个产品族,需要引入多个工厂接口。

抽象工厂模式

介绍

抽象工厂模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它引入了多个工厂接口,每个工厂接口负责创建一类产品。

组成部分

  1. 抽象工厂(Abstract Factory): 定义创建一系列产品对象的接口,每个方法对应一个产品。
  2. 具体工厂(Concrete Factory): 实现抽象工厂接口,负责创建一系列具体的产品。
  3. 抽象产品(Abstract Product): 定义一类产品对象的接口。
  4. 具体产品(Concrete Product): 实现抽象产品接口,具体产品由具体工厂创建。

结构图

在这里插入图片描述

场景

假设我们要创建一个跨平台的UI控件库,包括按钮和文本框,有两种不同的风格:Windows风格和Mac风格。

代码

// 抽象产品:按钮
interface Button {
    void render();
}

// 抽象产品:文本框
interface TextBox {
    void display();
}
// 具体产品1:Windows风格按钮
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("Render Windows Button");
    }
}

// 具体产品2:Mac风格按钮
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("Render Mac Button");
    }
}

// 具体产品3:Windows风格文本框
class WindowsTextBox implements TextBox {
    @Override
    public void display() {
        System.out.println("Display Windows TextBox");
    }
}

// 具体产品4:Mac风格文本框
class MacTextBox implements TextBox {
    @Override
    public void display() {
        System.out.println("Display Mac TextBox");
    }
}
// 抽象工厂:UI控件工厂
interface UIControlFactory {
    Button createButton();
    TextBox createTextBox();
}
// 具体工厂1:Windows风格工厂
class WindowsUIControlFactory implements UIControlFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextBox createTextBox() {
        return new WindowsTextBox();
    }
}

// 具体工厂2:Mac风格工厂
class MacUIControlFactory implements UIControlFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextBox createTextBox() {
        return new MacTextBox();
    }
}
// 客户端
public class AbstractFactoryPatternExample {
    public static void main(String[] args) {
        // 创建Windows风格UI控件
        UIControlFactory windowsFactory = new WindowsUIControlFactory();
        Button windowsButton = windowsFactory.createButton();
        TextBox windowsTextBox = windowsFactory.createTextBox();

        windowsButton.render();
        windowsTextBox.display();

        // 创建Mac风格UI控件
        UIControlFactory macFactory = new MacUIControlFactory();
        Button macButton = macFactory.createButton();
        TextBox macTextBox = macFactory.createTextBox();

        macButton.render();
        macTextBox.display();
    }
}

在这个例子中,UIControlFactory 是抽象工厂接口,定义了创建按钮和文本框的方法。WindowsUIControlFactory 和 MacUIControlFactory 是具体工厂,分别实现了Windows和Mac风格的UI控件。每个具体工厂对应一个产品族,即按钮和文本框的组合。客户端可以选择使用不同的工厂来创建不同风格的UI控件。这样,当需要增加新的UI控件时,只需要添加新的产品和工厂,而不需要修改现有的代码,符合开闭原则。


总结

我们再来总结一下工厂方法模式和抽象工厂模式的区别:

  1. 工厂方法模式是针对产品来定义工厂的,一类产品都需要一个工厂,如果一类产品有多个版本,那每个版本也需要各自对应一个工厂,会导致工厂的数量增加,这就是工厂方法模式的缺点。
  2. 而抽象工厂模式的出发点就是针对一个版本来定义一个工厂,比如有十个产品组成一个版本,那么只需要一个工厂来对应这个版本的十个产品即可,如果换成工厂方法模式,那么就需要10个工厂了。
文章来源:https://blog.csdn.net/csdn15917204572/article/details/135436275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。