Java设计模式精讲---02抽象工厂模式

导学

在创建型设计模式家族中,抽象工厂模式是工厂方法模式的 "进阶版"。它不仅继承了工厂方法模式的优势,还能处理更复杂的对象创建场景 ------一次性创建一整套相互匹配的 "产品族"。今天我们就来深入剖析这个设计模式。

抽象工厂模式概述

抽象工厂模式 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单来说,它能批量生产 "配套产品",比如 "华为手机 + 华为耳机 + 华为平板" 这样的产品族。

它还有个别名 ------Kit 模式(套件模式),形象地体现了它生产 "产品套件" 的特性。

抽象工厂模式结构与实现

抽象工厂模式包含以下 4 个核心角色:

角色 职责
抽象工厂 声明一组用于创建不同产品的方法,每个方法对应一种产品类型。
具体工厂 实现抽象工厂的方法,生产属于同一 "产品族" 的具体产品。
抽象产品 为每类产品声明接口,定义产品的业务方法。
具体产品 实现抽象产品接口,是具体工厂的生产结果。

实战:界面皮肤库设计

我们以 "界面皮肤库" 为例,实现一个支持 Spring 风格、Summer 风格的皮肤系统,每种风格包含配套的 "按钮、文本框、组合框"。

1. 抽象产品接口
java 复制代码
// 按钮接口
public interface Button {
    void display();
}

// 文本框接口
public interface TextField {
    void display();
}

// 组合框接口
public interface ComboBox {
    void display();
}
2. 具体产品实现
java 复制代码
​
// Spring风格按钮
public class SpringButton implements Button {
    @Override
    public void display() {
        System.out.println("显示浅绿色按钮");
    }
}

// Summer风格按钮
public class SummerButton implements Button {
    @Override
    public void display() {
        System.out.println("显示浅蓝色按钮");
    }
}

// Spring风格文本框
public class SpringTextField implements TextField {
    @Override
    public void display() {
        System.out.println("显示绿色边框文本框");
    }
}

// Summer风格文本框
public class SummerTextField implements TextField {
    @Override
    public void display() {
        System.out.println("显示蓝色边框文本框");
    }
}

// Spring风格组合框
public class SpringComboBox implements ComboBox {
    @Override
    public void display() {
        System.out.println("显示绿色边框组合框");
    }
}

// Summer风格组合框
public class SummerComboBox implements ComboBox {
    @Override
    public void display() {
        System.out.println("显示蓝色边框组合框");
    }
}

​
3. 抽象工厂与具体工厂
java 复制代码
​
// 皮肤工厂接口(抽象工厂)
public interface SkinFactory {
    Button createButton();
    TextField createTextField();
    ComboBox createComboBox();
}

// Spring皮肤工厂(具体工厂)
public class SpringSkinFactory implements SkinFactory {
    @Override
    public Button createButton() {
        return new SpringButton();
    }

    @Override
    public TextField createTextField() {
        return new SpringTextField();
    }

    @Override
    public ComboBox createComboBox() {
        return new SpringComboBox();
    }
}

// Summer皮肤工厂(具体工厂)
public class SummerSkinFactory implements SkinFactory {
    @Override
    public Button createButton() {
        return new SummerButton();
    }

    @Override
    public TextField createTextField() {
        return new SummerTextField();
    }

    @Override
    public ComboBox createComboBox() {
        return new SummerComboBox();
    }
}

​
4. 客户端测试
java 复制代码
​
public class Client {
    public static void main(String[] args) {
        // 从配置文件(或XML)中获取具体工厂类名,这里直接示例
        SkinFactory factory = new SpringSkinFactory(); // 可替换为SummerSkinFactory
        
        Button button = factory.createButton();
        TextField textField = factory.createTextField();
        ComboBox comboBox = factory.createComboBox();
        
        button.display();
        textField.display();
        comboBox.display();
    }
}

​

运行结果:

复制代码
显示浅绿色按钮
显示绿色边框文本框
显示绿色边框组合框

抽象工厂模式的优 / 缺点与适用环境

优点

1.隔离具体类生成:客户端无需关心产品如何创建,只需与抽象接口交互。

2.保证产品族一致性:同一工厂生产的产品天然匹配(如 Spring 风格的按钮、文本框、组合框视觉风格统一)。

3.支持开闭原则(新增产品族):新增一套皮肤时,无需修改原有代码,只需新增具体工厂和产品即可。

缺点

新增产品等级结构困难:若要新增 "单选按钮" 组件,需修改抽象工厂和所有具体工厂,违背开闭原则(这就是 "开闭原则的倾斜性")。

适用环境

  • 系统存在多个产品族,且每次只使用其中一个(如皮肤库的 "Spring 族""Summer 族")。
  • 产品族内的产品需一起使用,且结构稳定(设计完成后不再新增产品类型,如不再新增 "下拉树" 组件)。

总结

抽象工厂模式是创建 "产品族" 的利器,它让配套产品的创建更高效、更具一致性。虽然在新增产品类型时存在局限性,但在框架开发、多主题系统等场景中依然是不可替代的设计方案。掌握它,能让你的代码在处理复杂对象创建时更具扩展性与维护性。

相关推荐
wyhwust14 小时前
数组----插入一个数到有序数列中
java·数据结构·算法
专注于大数据技术栈14 小时前
java学习--final
java·开发语言·学习
天殇凉15 小时前
AC自动机学习笔记
java·笔记·学习
TechTrek15 小时前
Spring Boot 4.0正式发布了
java·spring boot·后端·spring boot 4.0
飞梦工作室15 小时前
企业级 Spring Boot 邮件系统开发指南:从基础到高可用架构设计
java·spring boot·后端
haiyu柠檬15 小时前
在Spring Boot中实现Azure的SSO+VUE3前端配置
java·spring boot·后端
百***812716 小时前
【SpringBoot】SpringBoot中分页插件(PageHelper)的使用
java·spring boot·后端
百***864616 小时前
SpringBoot中自定义Starter
java·spring boot·后端
q***071416 小时前
VScode 开发 Springboot 程序
java·spring boot·后端
q***465216 小时前
Spring中使用Async进行异步功能开发实战-以大文件上传为例
java·后端·spring