【设计模式】创建型-工厂方法模式

前言

工厂方法模式是一种经典的创建型设计模式,它提供了一种灵活的方式来创建对象实例。通过本文,我们将深入探讨工厂方法模式的概念、结构和应用。

一、什么是工厂方法模式

工厂方法模式是一种创建型设计模式,旨在解决对象的创建过程和客户端代码之间的耦合问题。它将对象的创建委托给子类来决定,从而使得客户端代码不需要直接依赖于具体的对象类型,而是通过调用工厂方法来创建所需的对象。

二、工厂方法模式的核心组成部分

工厂方法模式的核心组成部分包括:

  1. 抽象产品(Abstract Product):定义了产品的接口或抽象类,它是工厂方法模式所创建对象的共同接口。具体的产品类将实现这个接口,从而实现产品的具体功能。
  2. 具体产品(Concrete Product):实现了抽象产品接口的具体类,是工厂方法模式所创建的对象实例。每个具体产品类都实现了抽象产品定义的操作,从而提供了产品的具体功能。
  3. 抽象工厂(Abstract Factory):定义了一个创建产品对象的接口,包含一个抽象工厂方法用于创建产品对象。通常是一个抽象类或接口,可以有多个子类来实现具体的工厂方法。
  4. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建产品对象的具体工厂类。每个具体工厂类都实现了抽象工厂定义的工厂方法,从而创建具体的产品对象。

在这里插入图片描述

工厂方法模式通过以上组成部分,将对象的创建委托给子类来决定,从而实现了对象的解耦合。客户端代码不需要直接依赖于具体的产品类,而是通过工厂方法来获取所需的产品实例,从而提高了代码的灵活性和可维护性。

三、运用工厂方法模式

场景假设:我们需要创建不同形状的图形,包括圆形和矩形。

  1. 定义抽象产品接口(Abstract Product):首先,我们定义一个抽象产品接口,该接口声明了产品对象的通用行为或功能。

    // 抽象产品接口
    interface Shape {
        void draw();
    }
    
  2. 创建具体产品类(Concrete Product):然后,我们创建具体的产品类,实现了抽象产品接口中声明的方法。

    // 具体产品类:圆形
    class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
    
    // 具体产品类:矩形
    class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }
    
  3. 定义抽象工厂接口(Abstract Factory):接下来,我们定义一个抽象工厂接口,该接口声明了一个工厂方法用于创建产品对象。

    // 抽象工厂接口
    interface ShapeFactory {
        Shape createShape();
    }
    
  4. 创建具体工厂类(Concrete Factory):然后,我们创建具体的工厂类,实现了抽象工厂接口中的工厂方法。

    // 具体工厂类:圆形工厂
    class CircleFactory implements ShapeFactory {
        @Override
        public Shape createShape() {
            return new Circle();
        }
    }
    
    // 具体工厂类:矩形工厂
    class RectangleFactory implements ShapeFactory {
        @Override
        public Shape createShape() {
            return new Rectangle();
        }
    }
    
  5. 客户端使用工厂方法创建对象:最后,客户端代码通过具体工厂类调用工厂方法来创建产品对象。客户端代码不直接创建具体产品对象,而是通过工厂方法来获取所需的产品对象。这样客户端就不需要了解或依赖于具体的产品类,从而实现了对象的解耦合。

    // 客户端代码
    public class Main {
        public static void main(String[] args) {
            // 创建圆形工厂
            ShapeFactory circleFactory = new CircleFactory();
            // 使用圆形工厂创建圆形对象
            Shape circle = circleFactory.createShape();
            // 绘制圆形
            circle.draw();
    
            // 创建矩形工厂
            ShapeFactory rectangleFactory = new RectangleFactory();
            // 使用矩形工厂创建矩形对象
            Shape rectangle = rectangleFactory.createShape();
            // 绘制矩形
            rectangle.draw();
        }
    }
    

四、工厂方法模式的特点

  1. 符合开闭原则(Open-Closed Principle):工厂方法模式通过将对象的创建委托给子类,在不修改现有代码的情况下引入新的产品类,符合开闭原则。
  2. 隐藏对象创建细节:客户端只需关心产品的接口,无需关心具体产品的创建过程,从而降低了系统的耦合度。
  3. 提供了一种可扩展的方式:通过新增具体工厂类和具体产品类,可以轻松扩展系统功能,满足不同的需求。

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

工厂方法模式在许多领域都有着广泛的应用,特别适用于以下场景:

  1. 对象的创建需要根据不同的条件进行选择:例如,根据用户的地区选择不同的支付方式。
  2. 系统需要支持多种类型的产品,并且需要动态扩展:例如,一个电商平台需要支持新增的商品类型。

六、小结

工厂方法模式是一种强大的设计模式,它提供了一种灵活的方式来创建对象实例,同时实现了对象的解耦合。通过合理地应用工厂方法模式,我们可以编写出模块化、可维护的代码,提高软件系统的灵活性和可扩展性。在设计软件系统时,我们应该根据具体的需求和场景选择合适的设计模式,从而更好地满足项目的需求。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DevOps】Elasticsearch在Ubuntu 20.04上的安装与配置:详细指南

目录 一、ES 简介 1、核心概念 2、工作原理 3、 优势 二、ES 在 Ubuntu 20.04 上的安装 1、安装 Java 2、下载 ES 安装包 3、创建 ES 用户 4 、解压安装包 5、 配置 ES 6、 启动 ES 7、验证安装 三、ES 常用命令 1、创建索引 2、 插入文档 3、查询文档 四、ES…

操作系统 - 输入/输出(I/O)管理

输入/输出(I/O)管理 考纲内容 I/O管理基础 设备:设备的基本概念,设备的分类,I/O接口 I/O控制方式:轮询方式,中断方式,DMA方式 I/O软件层次结构:中断处理程序,驱动程序,…

VM中Ubuntu16.04的下载以及ROS—kinetic的版本下载

一、Ubuntu镜像地址 转载备份一下; 官方下载地址(不推荐) https://www.ubuntu.com/downloadhttps://www.ubuntu.com/download 中科大源 Index of /ubuntu-releases/16.04/http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开…

使用 Django ORM 进行数据库操作

文章目录 创建Django项目和应用定义模型查询数据更新和删除数据总结与进阶聚合和注解跨模型查询原始SQL查询 Django是一个流行的Web应用程序框架,它提供了一个强大且易于使用的对象关系映射(ORM)工具,用于与数据库进行交互。在本文…

0基础认识C语言(理论知识)

为了给0基础一个舒服的学习路径,就有了这个专栏希望带大家一起进步。 话不多说,开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初,在那个时代美国有这么一号人叫做丹尼斯.里奇,他和同事肯.汤普逊…

学习编程对英语要求高吗?

学习编程并不一定需要高深的英语水平。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 虽然一些编程资源和文档可能…

cesium开发实例分享

反正 cesium 看到的效果几乎都有

大字体学生出勤记录系统网页HTML源码

源码介绍 上课需要一个个点名记录出勤情况,就借助AI制作了一个网页版学生出勤记录系统, 大字体显示学生姓名和照片,让坐在最后排学生也能看清楚,显示姓名同时会语音播报姓名, 操作很简单,先导入学生姓名…

AI智能体|扣子Coze文生图功能接入微信公众号

大家好,我是无界生长。 AI智能体|扣子Coze文生图功能接入微信公众号本文分享了如何将Coze平台的文生图功能接入微信公众号的详细操作流程,包括创建图像流、创建并配置Bot、设置提示词和开场白、调试、发布等步骤。如果看完还没学会的话&…

云主机选购指南:如何选择适合自己的云主机

一、认识移动云 移动云是中国移动提供的专业云服务品牌,基于移动云计算技术构建。它实现了云网一体化,确保客户享有安全可控的服务。通过充分利用移动云计算能力,打造了N31X资源布局,结合各省级数据中心,通过专线互联…

基于OrangePi AIpro的后端服务器构建

一. OrangePi AIpro简介 1.1 OrangePi AIpro外观 1.2 OrangePi AIpro配置 OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB…

VS Code开发Python配置和使用教程

在Visual Studio Code (VSCode) 中配置和使用Python进行开发是一个相对直接的过程,下面是一份简明的指南,帮助你从零开始设置环境: 1. 安装Visual Studio Code 首先,确保你已经安装了Visual Studio Code。如果还没有安装&#x…

图生文模型llava

llava-llama-3-8b-v1_1 是一个 LLaVA 模型,由 XTuner 使用 ShareGPT4V-PT 和 InternVL-SFT 从 meta-llama/Meta-Llama-3-8B-Instruct 和 CLIP-ViT-Large-patch14-336 进行微调。 https://huggingface.co/xtuner/llava-llama-3-8b-v1_1-gguf

AURIX TC3xx单片机介绍-启动过程介绍1

从各个域控制器硬件解决方案来看,MPU可能来自多个供应商,有瑞萨,有NXP等,但对于MCU来说,基本都采用英飞凌TC3xx。 今天我们就来看一下TC3xx的启动过程,主要包含如下内容: uC上电过程中,会经过一个上电时序,从复位状态“脱离”出来;Boot Firmware是复位后第一个执行的…

设置 border 边框单侧样式 - HarmonyOSNext

设置 border 边框单侧样式,通过 api 中查看 border(value: BorderOptions): T; BorderOptions 又包含了若干个子属性 1.width?: EdgeWidths | Length; 2.color?: EdgeColors | ResourceColor; 3.radius?: BorderRadiuses | Length; 4.style?: EdgeStyles | BorderStyle; 其…

【Docker】docker-compose 常用命令

启动服务: docker-compose up 如果你想在后台运行服务,可以添加 -d 标志: docker-compose up -d 开启所有服务 docker-compose start 停止服务: docker-compose down 查看服务状态: docker-compose ps 查看…

React(4): 使用 unocss + react-ts + vite 开发

React(4): 使用 unocss react ts 开发 之前一直使用 css-module 开发页面,觉得太过繁琐,看到 unocss , 眼前一亮,觉得可以拿来快速开发页面(偷懒) vite官网 unocss tailwindcss 说明 该方法需要对 tailwindcss 有一…

ROS学习笔记(16):夹缝循迹

0.前言 在笔记的第15期对巡墙驾驶的原理进行了简单讲解,而这期我们来讲一下夹缝循迹,也常被叫follow the gap,也更新一些概念。 1.探索式路径规划与避障 1.概念 无预先建图的路径规划叫探索式路径规划,例如巡墙循迹和夹缝循迹&…

操作系统 - 文件管理

文件管理 考纲内容 文件 文件的基本概念;文件元数据和索引节点(inode) 文件的操作:建立,删除,打开,关闭,读,写 文件的保护;文件的逻辑结构;文件的物理结构目录 目录的基…

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…