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

定义:

抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列或相互依赖对象的接口,而无须指定它们具体的类。

**概述:**一个工厂可以提供创建多种相关产品的接口,而无需像工厂方法一样,为每一个产品都提供一个具体工厂

以下是抽象工厂模式的一些常见用途:

  1. 系统独立性:抽象工厂模式可以让客户端与具体类的创建逻辑分离,使得客户端代码不依赖于具体类,从而提高了系统的独立性。

  2. 产品族的创建:抽象工厂模式通常用于创建一系列相关或相互依赖的产品,这些产品被设计成一起使用,例如,在图形用户界面 (GUI) 应用程序中,可能需要一套相同风格的按钮、文本框和窗口。

  3. 跨平台兼容性:抽象工厂模式可以帮助在不同的平台上创建相同风格的产品,而无需修改客户端代码。例如,在开发跨平台的游戏时,可以使用抽象工厂模式创建适配于不同平台的相同类型的游戏对象。

抽象工厂模式核心角色:

  1. 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  3. 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  4. 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。

示例:

假设我们有两种类型的电脑:台式机和笔记本电脑,每种电脑都有不同的规格:高性能和普通型。我们将使用抽象工厂模式来创建这些电脑。

代码:

java 复制代码
// 台式机接口
interface Desktop {
    void displayInfo();
}

// 笔记本电脑接口
interface Laptop {
    void displayInfo();
}

// 具体的工厂类
class ConcreteComputerFactory implements ComputerFactory {
    @Override
    public Desktop createDesktop() {
        return new RegularDesktop();
    }

    @Override
    public Laptop createLaptop() {
        return new HighPerformanceLaptop();
    }
}

// 普通型台式机
class RegularDesktop implements Desktop {
    @Override
    public void displayInfo() {
        System.out.println("这是一台普通的台式电脑。");
    }
}

// 高性能笔记本电脑
class HighPerformanceLaptop implements Laptop {
    @Override
    public void displayInfo() {
        System.out.println("这是一台高性能的笔记本电脑。");
    }
}

// 电脑工厂接口
interface ComputerFactory {
    Desktop createDesktop(); // 创建台式机
    Laptop createLaptop();   // 创建笔记本电脑
}

public class Main {
    public static void main(String[] args) {
        // 创建具体的工厂
        ComputerFactory factory = new ConcreteComputerFactory();

        // 创建台式机
        Desktop desktop = factory.createDesktop();
        desktop.displayInfo();

        // 创建笔记本电脑
        Laptop laptop = factory.createLaptop();
        laptop.displayInfo();
    }
}

运行截图:

相关推荐
聊浮游16 分钟前
JAVA2026最新全套学习资料、学习路线
java·开发语言·jvm·mysql·spring·maven·idea
MacroZheng28 分钟前
完美替代 Navicat!这款内置 AI 的数据库工具,太香了!
java·后端·mysql
SamDeepThinking1 小时前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
Zane19941 小时前
接口都能写默认实现了,为什么还需要抽象类
java·后端
未秃头的程序猿1 小时前
读Spring AI源码的方法——不是硬啃,是带着问题去翻
java·后端·spring
用户3126874877201 小时前
别再 Thread.sleep 硬等了!并发工具类到底怎么选?
java
Java内核笔记1 小时前
万字长文剖析 Spring Boot 4 自动配置机制源码:从 @EnableAutoConfiguration 到条件装配
java·后端
evans在进步1 小时前
Spring MVC 核心机制详解:全局异常处理、请求跳转与数据绑定
java·spring·mvc
嘟嘟07171 小时前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
weixin_BYSJ19871 小时前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php