【设计模式】抽象工厂模式详解

抽象工厂

是一种为访问类提供一个创建一族相关或者相互依赖对象的接口,且访问类无须指定所要产品的具体类就可以得到同一族的不同等级的产品模式结构

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产多个等级的产品

结构
  • 抽象工厂(Abstract Factory):提供了创建产品的接口,包含了多个创建产品的方法,可以创建不同等级的产品。
  • 具体工厂(Concreteractory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct实现了抽象产品角色所定义的接口,由具体工厂来创建,它同县体工厂之间是多对一的关系
实现

升级到抽象工厂模式,通常意味着我们要处理多个相关的产品族,每个产品族都有各自的接口或抽象类,而抽象工厂则提供了创建这些产品族中产品的接口。下面是将工厂方法模式升级为抽象工厂模式的示例:

首先,我们引入一个新的产品族------颜色(Color),并为形状和颜色分别定义接口:

java 复制代码
// 定义形状接口
interface Shape {
    void draw();
}

// 定义具体形状类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle...");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle...");
    }
}

// 定义颜色接口
interface Color {
    void fill();
}

// 定义具体颜色类
class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with red color...");
    }
}

class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with blue color...");
    }
}

// 定义抽象工厂接口
interface AbstractFactory {
    Shape getShape(String type);
    Color getColor(String type);
}

// 定义具体工厂类
class ShapeColorFactory implements AbstractFactory {
    @Override
    public Shape getShape(String type) {
        if ("circle".equalsIgnoreCase(type)) {
            return new Circle();
        } else if ("rectangle".equalsIgnoreCase(type)) {
            return new Rectangle();
        } else {
            throw new IllegalArgumentException("Invalid shape type: " + type);
        }
    }

    @Override
    public Color getColor(String type) {
        if ("red".equalsIgnoreCase(type)) {
            return new Red();
        } else if ("blue".equalsIgnoreCase(type)) {
            return new Blue();
        } else {
            throw new IllegalArgumentException("Invalid color type: " + type);
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 使用抽象工厂创建不同形状和颜色的对象
        AbstractFactory factory = new ShapeColorFactory();

        Shape circle = factory.getShape("circle");
        circle.draw();
        
        Color red = factory.getColor("red");
        red.fill();

        Shape rectangle = factory.getShape("rectangle");
        rectangle.draw();

        Color blue = factory.getColor("blue");
        blue.fill();

        // 尝试创建无效类型
        try {
            Shape invalidShape = factory.getShape("triangle");
            Color invalidColor = factory.getColor("green");
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

在这个抽象工厂模式的示例中,AbstractFactory接口提供了创建形状和颜色两个产品族的方法,而ShapeColorFactory是它的具体实现,负责创建具体的产品对象。客户端代码现在可以一次性获取形状和颜色的完整组合,而且可以轻松地扩展其他产品族或者产品类型。

优点

当一个产品族中的多个对象被设计成一起工作时,可以保证客户端始终只使用同一产品族中的对象。

缺点

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

相关推荐
咖啡八杯1 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
槑有老呆1 天前
从 Prompt Engineering 到 Harness Engineering:AI 编程的下一次跃迁
设计模式
HjhIron2 天前
从Prompt到Context:大模型应用开发的范式转移
设计模式·aigc·ai编程
咖啡八杯3 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
胡萝卜术3 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
亦暖筑序4 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
青禾网络7 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO8 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯8 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术8 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播