(三)趣学设计模式 之 抽象工厂模式!

news/2025/2/23 12:54:56

在这里插入图片描述

目录


🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解工厂方法模式请看: (二)趣学设计模式 之 工厂方法模式!

这篇文章带你详细认识一下设计模式中的抽象工厂模式

一、 啥是抽象工厂模式

想象一下,你开了一家家具店 🪑,要卖不同风格的家具,比如现代风格和古典风格。每种风格都包含一套完整的家具,包括沙发 🛋️、茶几 ☕️、椅子 💺。

抽象工厂模式就像这样,每个风格都有自己的专属工厂,现代风格工厂生产现代风格的沙发、茶几和椅子,古典风格工厂生产古典风格的沙发、茶几和椅子。这样,你只需要选择一个风格的工厂,就能得到一整套风格统一的家具!

简单来说,抽象工厂模式就是:生产一系列相关的产品,保证这些产品风格统一!

二、 为什么要用抽象工厂模式

  • 产品族概念: 强调产品之间的关联性,保证产品风格统一。
  • 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
  • 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。

三、 抽象工厂模式怎么实现?

// 1. 定义抽象产品接口
interface Sofa {
    void comfort(); // 舒适度
}

interface CoffeeTable {
    void place(); // 放置物品
}

interface Chair {
    void sit(); // 坐
}

// 2. 定义具体的产品类
// 现代风格家具
class ModernSofa implements Sofa {
    @Override
    public void comfort() {
        System.out.println("现代沙发,舒适度高! ✨");
    }
}

class ModernCoffeeTable implements CoffeeTable {
    @Override
    public void place() {
        System.out.println("现代茶几,可以放置各种物品! 💻");
    }
}

class ModernChair implements Chair {
    @Override
    public void sit() {
        System.out.println("现代椅子,坐着很舒服! 😊");
    }
}

// 古典风格家具
class ClassicSofa implements Sofa {
    @Override
    public void comfort() {
        System.out.println("古典沙发,很有历史感! 🕰️");
    }
}

class ClassicCoffeeTable implements CoffeeTable {
    @Override
    public void place() {
        System.out.println("古典茶几,可以放置古董! 🏺");
    }
}

class ClassicChair implements Chair {
    @Override
    public void sit() {
        System.out.println("古典椅子,坐着很有仪式感! 👑");
    }
}

// 3. 定义抽象工厂接口
interface FurnitureFactory {
    Sofa createSofa();
    CoffeeTable createCoffeeTable();
    Chair createChair();
}

// 4. 定义具体的工厂类
// 现代风格家具工厂
class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Sofa createSofa() {
        System.out.println("现代家具工厂正在生产现代沙发! 🛋️");
        return new ModernSofa();
    }

    @Override
    public CoffeeTable createCoffeeTable() {
        System.out.println("现代家具工厂正在生产现代茶几! ☕");
        return new ModernCoffeeTable();
    }

    @Override
    public Chair createChair() {
        System.out.println("现代家具工厂正在生产现代椅子! 💺");
        return new ModernChair();
    }
}

// 古典风格家具工厂
class ClassicFurnitureFactory implements FurnitureFactory {
    @Override
    public Sofa createSofa() {
        System.out.println("古典家具工厂正在生产古典沙发! 🛋️");
        return new ClassicSofa();
    }

    @Override
    public CoffeeTable createCoffeeTable() {
        System.out.println("古典家具工厂正在生产古典茶几! ☕");
        return new ClassicCoffeeTable();
    }

    @Override
    public Chair createChair() {
        System.out.println("古典家具工厂正在生产古典椅子! 💺");
        return new ClassicChair();
    }
}

// 5. 客户端使用
public class Client {
    public static void main(String[] args) {
        // 创建现代风格家具工厂
        FurnitureFactory modernFactory = new ModernFurnitureFactory();
        // 生产一套现代风格家具
        Sofa modernSofa = modernFactory.createSofa();
        CoffeeTable modernCoffeeTable = modernFactory.createCoffeeTable();
        Chair modernChair = modernFactory.createChair();
        modernSofa.comfort(); // 输出:现代沙发,舒适度高! ✨
        modernCoffeeTable.place(); // 输出:现代茶几,可以放置各种物品! 💻
        modernChair.sit(); // 输出:现代椅子,坐着很舒服! 😊

        // 创建古典风格家具工厂
        FurnitureFactory classicFactory = new ClassicFurnitureFactory();
        // 生产一套古典风格家具
        Sofa classicSofa = classicFactory.createSofa();
        CoffeeTable classicCoffeeTable = classicFactory.createCoffeeTable();
        Chair classicChair = classicFactory.createChair();
        classicSofa.comfort(); // 输出:古典沙发,很有历史感! 🕰️
        classicCoffeeTable.place(); // 输出:古典茶几,可以放置古董! 🏺
        classicChair.sit(); // 输出:古典椅子,坐着很有仪式感! 👑
    }
}

代码解释:

  • SofaCoffeeTableChair:抽象产品接口,定义了家具的通用行为。
  • ModernSofaModernCoffeeTableModernChairClassicSofaClassicCoffeeTableClassicChair:具体的产品类,实现了家具接口,分别代表现代风格和古典风格的沙发、茶几和椅子。
  • FurnitureFactory:抽象工厂接口,定义了创建一套家具的通用方法。
  • ModernFurnitureFactoryClassicFurnitureFactory:具体的工厂类,实现了 FurnitureFactory 接口,分别负责创建现代风格和古典风格的家具。
  • createSofa()createCoffeeTable()createChair():创建家具的方法。

输出结果:

现代家具工厂正在生产现代沙发! 🛋️
现代家具工厂正在生产现代茶几! ☕
现代家具工厂正在生产现代椅子! 💺
现代沙发,舒适度高! ✨
现代茶几,可以放置各种物品! 💻
现代椅子,坐着很舒服! 😊
古典家具工厂正在生产古典沙发! 🛋️
古典家具工厂正在生产古典茶几! ☕
古典家具工厂正在生产古典椅子! 💺
古典沙发,很有历史感! 🕰️
古典茶几,可以放置古董! 🏺
古典椅子,坐着很有仪式感! 👑

四、 抽象工厂模式的应用场景

  • GUI 框架: 可以使用抽象工厂模式创建不同风格的界面组件(按钮、文本框、窗口等)。
  • 游戏开发: 可以使用抽象工厂模式创建不同风格的游戏角色、场景、道具等。
  • 操作系统: 可以使用抽象工厂模式创建不同风格的操作系统界面。

五、 抽象工厂模式的优点和缺点

优点:

  • 产品族概念: 强调产品之间的关联性,保证产品风格统一。
  • 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
  • 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。

缺点:

  • 难以扩展产品: 如果要添加新的产品类型(比如添加一个书柜),需要修改所有的工厂接口和实现类,比较麻烦 😥。
  • 复杂度增加: 代码结构相对复杂,理解起来稍微困难。

六、 抽象工厂模式与工厂方法模式的区别

抽象工厂模式和工厂方法模式都是工厂模式,但它们解决的问题不同:

  • 工厂方法模式: 关注的是单个产品的创建,每个工厂只负责创建一种产品。
  • 抽象工厂模式 关注的是产品族的创建,每个工厂负责创建一系列相关的产品。

举个例子:

  • 工厂方法模式: 就像不同的甜品店,蛋糕店只卖蛋糕,饼干店只卖饼干,面包店只卖面包。
  • 抽象工厂模式 就像不同的家具店,现代家具店卖现代风格的沙发、茶几和椅子,古典家具店卖古典风格的沙发、茶几和椅子。

总结一下:

特性工厂方法模式抽象工厂模式
关注点单个产品的创建产品族的创建
产品关系产品之间没有必然联系产品之间存在关联,风格统一
扩展性易于扩展新的产品类型易于扩展新的产品族,但难以扩展单个产品类型
适用场景产品类型较多,需要灵活扩展的场景产品族概念明确,且需要灵活切换产品族的场景

七、 总结

  • 抽象工厂模式用于创建一系列相关的产品,保证这些产品风格统一。
  • 每个工厂负责创建一套完整的产品族。
  • 添加新的产品族,只需要添加新的工厂类即可,符合开闭原则。
  • 抽象工厂模式适用于产品族概念明确,且需要灵活切换产品族的场景。
  • 抽象工厂模式与工厂方法模式的区别在于,抽象工厂模式关注的是产品族的创建,而工厂方法模式关注的是单个产品的创建。

希望这篇文章能让你彻底理解抽象工厂模式,并区分它与工厂方法模式! 👍

看完请看:(四)趣学设计模式 之 原型模式!


http://www.niftyadmin.cn/n/5863415.html

相关文章

编程小白冲Kaggle每日打卡(12)--kaggle学堂:<机器学习简介>模型如何工作

Kaggle官方课程链接:How Models Work 本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。 How Models Work 第一步,如果你是机器学习的新手。 Introduction 我们将从概述机器学习模型的工作原理和使用方法开始。如果你以前做过统计建模…

YOLOv8与DAttention机制的融合:复杂场景下目标检测性能的增强

文章目录 1. YOLOv8简介2. DAttention (DAT)注意力机制概述2.1 DAttention机制的工作原理 3. YOLOv8与DAttention (DAT)的结合3.1 引入DAT的动机3.2 集成方法3.3 代码实现 4. 实验与结果分析4.1 实验设置4.2 结果分析推理速度性能对比 5. 深度分析:DAttention在YOLO…

分发糖果(力扣135)

题目说相邻的两个孩子中评分更高的孩子获得的糖果更多,表示我们既要考虑到跟左边的孩子比较,也要考虑右边的孩子,但是我们如果两边一起考虑一定会顾此失彼。这里就引入一个思想:先满足右边大于左边时的糖果分发情况,再…

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆,第i个房间有J[i] 磅的五香豆&#xf…

【HeadFirst系列之HeadFirstJava】第3天之从零开始理解Java中的主数据类型和引用

从零开始理解Java中的主数据类型和引用 《Head First Java》是一本非常适合初学者的Java入门书籍,它以轻松幽默的方式讲解了Java的核心概念。在第三章节中,书中详细介绍了Java的主数据类型(Primitive Types)和引用(Re…

SpringBoot中实现限流和熔断功能

我们将使用Java的ScheduledExecutorService来实现一个简单的令牌桶算法(Token Bucket Algorithm),并结合一个自定义的服务类来处理第三方API调用。 1. 创建限流器 首先,创建一个简单的限流器类: import java.util.concurrent.*;public class SimpleRateLimiter {

计算机专业知识【数据库完整性约束:数据质量的坚固防线】

在数据库管理的领域中,数据的准确性、一致性和可靠性是至关重要的。为了保障这些特性,我们引入了各种完整性约束机制。接下来,就为大家详细介绍用户定义的完整性约束、实体完整性约束、参照完整性约束和关键字完整性约束,让数据库…

利用爬虫获取淘宝商品描述:实战案例指南

在电商领域,商品描述是消费者了解产品细节、做出购买决策的重要依据。精准获取淘宝商品描述不仅能帮助商家优化产品信息,还能为市场研究和数据分析提供丰富的数据资源。本文将详细介绍如何利用爬虫技术精准获取淘宝商品描述,并分享关键技术和…