(二)趣学设计模式 之 工厂方法模式!

news/2025/2/23 13:16:04

在这里插入图片描述

目录


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

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

一、 啥是工厂方法模式

想象一下,你开了一家甜品店 🍰,有蛋糕 🎂、饼干 🍪、面包 🍞 三种甜点。如果只有一个厨师,啥都做,那他不得累死?而且万一你想加个新品种,还得让他学新的手艺,太麻烦了!

工厂方法模式就像这样,每种甜点都有自己的专属厨师(工厂),蛋糕厨师只做蛋糕,饼干厨师只做饼干,面包厨师只做面包。这样,每个厨师都专注于自己的领域,而且你想加新品种,只需要招一个新的厨师就行了!

简单来说,工厂方法模式就是:每个产品都有自己的专属工厂,负责创建该产品!

二、 为什么要用工厂方法模式

  • 职责分离: 每个工厂只负责创建一种产品,职责更清晰。
  • 扩展性好: 添加新的产品类型,只需要添加新的工厂类即可,不需要修改原来的代码,符合开闭原则 👍。
  • 灵活性高: 可以根据需要选择不同的工厂来创建产品。

三、 工厂方法模式怎么实现?

java">// 1. 定义产品接口
interface Dessert {
    void show(); // 展示甜点
}

// 2. 定义具体的产品类
class Cake implements Dessert {
    @Override
    public void show() {
        System.out.println("我是美味的蛋糕! 🎂");
    }
}

class Cookie implements Dessert {
    @Override
    public void show() {
        System.out.println("我是香甜的饼干! 🍪");
    }
}

class Bread implements Dessert {
    @Override
    public void show() {
        System.out.println("我是松软的面包! 🍞");
    }
}

// 3. 定义工厂接口
interface DessertFactory {
    Dessert createDessert(); // 创建甜点
}

// 4. 定义具体的工厂类
class CakeFactory implements DessertFactory {
    @Override
    public Dessert createDessert() {
        System.out.println("蛋糕工厂正在制作蛋糕! 🍰");
        return new Cake();
    }
}

class CookieFactory implements DessertFactory {
    @Override
    public Dessert createDessert() {
        System.out.println("饼干工厂正在制作饼干! 🍪");
        return new Cookie();
    }
}

class BreadFactory implements DessertFactory {
    @Override
    public Dessert createDessert() {
        System.out.println("面包工厂正在制作面包! 🍞");
        return new Bread();
    }
}

// 5. 客户端使用
public class Client {
    public static void main(String[] args) {
        // 创建蛋糕工厂
        DessertFactory cakeFactory = new CakeFactory();
        // 生产蛋糕
        Dessert cake = cakeFactory.createDessert();
        cake.show(); // 输出:我是美味的蛋糕! 🎂

        // 创建饼干工厂
        DessertFactory cookieFactory = new CookieFactory();
        // 生产饼干
        Dessert cookie = cookieFactory.createDessert();
        cookie.show(); // 输出:我是香甜的饼干! 🍪

        // 创建面包工厂
        DessertFactory breadFactory = new BreadFactory();
        // 生产面包
        Dessert bread = breadFactory.createDessert();
        bread.show(); // 输出:我是松软的面包! 🍞
    }
}

解释:

  • Dessert:产品接口,定义了甜点的通用行为(展示自己)。
  • CakeCookieBread:具体的产品类,实现了 Dessert 接口,分别代表蛋糕、饼干和面包。
  • DessertFactory:工厂接口,定义了创建甜点的通用方法。
  • CakeFactoryCookieFactoryBreadFactory:具体的工厂类,实现了 DessertFactory 接口,分别负责创建蛋糕、饼干和面包。
  • createDessert():创建甜点的方法。

输出结果:

蛋糕工厂正在制作蛋糕! 🍰
我是美味的蛋糕! 🎂
饼干工厂正在制作饼干! 🍪
我是香甜的饼干! 🍪
面包工厂正在制作面包! 🍞
我是松软的面包! 🍞

四、 工厂方法模式的应用场景

  • 日志框架: 可以使用工厂方法模式创建不同类型的日志记录器(文件日志、数据库日志等)。
  • 支付系统: 可以使用工厂方法模式创建不同类型的支付方式(支付宝、微信支付等)。
  • 游戏开发: 可以使用工厂方法模式创建不同类型的游戏角色(战士、法师、弓箭手等)。

五、 工厂方法模式的优点和缺点

优点:

  • 职责分离: 每个工厂只负责创建一种产品,职责更清晰。
  • 扩展性好: 添加新的产品类型,只需要添加新的工厂类即可,不需要修改原来的代码,符合开闭原则 👍。
  • 灵活性高: 可以根据需要选择不同的工厂来创建产品。

缺点:

  • 类增多: 需要为每个产品都创建一个工厂类,导致类的数量增多。
  • 复杂度增加: 代码结构相对复杂,理解起来稍微困难。

六、 总结

  • 工厂方法模式为每个产品都定义一个专属的工厂。
  • 每个工厂只负责创建一种产品,职责更清晰。
  • 添加新的产品类型,只需要添加新的工厂类即可,符合开闭原则。
  • 工厂方法模式适用于产品类型较多,且需要灵活扩展的场景。

希望这篇文章能让你彻底理解工厂方法模式! 👍
看完请看:(三)趣学设计模式 之 抽象工厂模式!


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

相关文章

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…

蓝桥杯真题 - 缴纳过路费 - 题解

题目链接:https://www.lanqiao.cn/problems/19736/learning/ 个人评价:难度 2 星(满星:5) 前置知识:并查集 整体思路 按边权从小到大处理,将处理过的边的两个端点合入一个并查集中&#xff1b…

深入解析设计模式之单例模式

深入解析设计模式之单例模式 在软件开发的复杂世界里,设计模式是开发者手中的得力工具,它们是对常见问题的总结和通用解决方案。单例模式作为其中一种基础且常用的设计模式,在各类应用中扮演着重要角色。 一、单例模式的定义与概念 单例模…

CNewMenu::QueryContextMenu函数分析之新建菜单项的创建

CNewMenu::QueryContextMenu函数分析之新建菜单项的创建 第一部分: HRESULT CNewMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { // if they want the default menu only (CMF_DEFAULTONLY) OR //…

靶场之路-Kioptix Level-1 mod_ssl 缓冲区溢出漏洞

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、准备工作 首先使用 vmware 导入靶机文件, 然后网络模式改成 nat 模式即可 我们打…

Open WebUI选择模型为空,解决办法(for DeepSeek)

标签: DeepSeek; Open WebUI; 问题:Open WebUI选择模型为空,解决办法 (for DeepSeek) 操作系统:Ubuntu 22 硬件:台式电脑 Ubuntu 22系统,DeepSeek安装成功&…

使用 WebGL 和 React Three Fiber 实现的粒子流体流动特效

在Web 开发中粒子系统广泛应用于各种动画效果和数据可视化场景。本文将介绍如何使用 WebGL 和 React Three Fiber 实现一个高效的 GPU 粒子系统。通过利用 GPU 的并行计算能力,我们可以在不牺牲性能的情况下实现复杂的粒子动画。 粒子动画 1,项目结构 项目的目录结构: in…

C# 中DevExpress的GridView中Appearance 属性

在 C# 中使用 DevExpress 的 GridView 时,Appearance 属性通常用于全局设置样式(如所有行的背景颜色)。如果需要对指定行设置样式,不能直接通过 Appearance 实现,而是需要使用事件(如 RowStyle)…