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

目录

    • [一、 啥是抽象工厂模式?](#一、 啥是抽象工厂模式?)
    • [二、 为什么要用抽象工厂模式?](#二、 为什么要用抽象工厂模式?)
    • [三、 抽象工厂模式怎么实现?](#三、 抽象工厂模式怎么实现?)
    • [四、 抽象工厂模式的应用场景](#四、 抽象工厂模式的应用场景)
    • [五、 抽象工厂模式的优点和缺点](#五、 抽象工厂模式的优点和缺点)
    • [六、 抽象工厂模式与工厂方法模式的区别](#六、 抽象工厂模式与工厂方法模式的区别)
    • [七、 总结](#七、 总结)

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

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

一、 啥是抽象工厂模式?

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

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

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

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

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

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

java 复制代码
// 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 框架: 可以使用抽象工厂模式创建不同风格的界面组件(按钮、文本框、窗口等)。
  • 游戏开发: 可以使用抽象工厂模式创建不同风格的游戏角色、场景、道具等。
  • 操作系统: 可以使用抽象工厂模式创建不同风格的操作系统界面。

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

优点:

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

缺点:

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

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

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

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

举个例子:

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

总结一下:

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

七、 总结

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

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

相关推荐
菜鸟一枚在这30 分钟前
深入理解设计模式之代理模式
java·设计模式·代理模式
mjr2 小时前
设计模式-Java
java·设计模式
yuanpan3 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
FLZJ_KL4 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
万兴丶7 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这7 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
程序猿多布8 小时前
C#设计模式 学习笔记
设计模式·c#
強云12 小时前
23种设计模式 - 模板方法
设计模式·模板方法
workflower18 小时前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程