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

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 4. 应用示例
    • 结语

在软件开发中,工厂方法模式是一种常见的创建型设计模式,它提供了一种将对象的实例化延迟到子类的方法。工厂方法模式通过定义一个创建对象的接口,但是让子类决定实例化哪个类。在本文中,我们将介绍 Java 设计模式中的工厂方法模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是将对象的实例化延迟到子类中。这样,在实际使用时,客户端代码不需要关心具体实例是哪个类,只需通过工厂方法获取对象即可。工厂方法模式通过解耦了客户端和具体类的关系,使系统更加灵活。

2. 应用场景

工厂方法模式的应用场景包括但不限于以下情况:

  1. 对象创建复杂:

    当对象的创建过程比较复杂,包括多个步骤或涉及多个类的协作时,可以将创建过程封装在具体工厂类中

  2. 系统扩展性:

    当系统需要支持新的产品时,只需新增对应的具体工厂类和产品类,而无需修改已有代码

  3. 类不知道具体实现:

    通过接口或抽象类定义了对象的创建方法,使客户端只需知道抽象产品类和抽象工厂类,而不需要知道具体实现类

3. 代码实现

工厂方法模式的实现主要涉及以下几个角色:

在这里插入图片描述

  • 抽象产品接口(Product): 定义了产品的抽象方法
  • 具体产品实现类(ConcreteProduct): 实现了抽象产品接口,是工厂方法创建的具体对象
  • 抽象工厂接口(Factory): 定义了工厂方法的接口,负责创建产品的抽象方法
  • 具体工厂实现类(ConcreteFactory): 实现了抽象工厂接口,负责创建具体产品的对象

下面是一个简单的工厂方法模式的实现示例:

1)抽象产品接口

package com.cheney.demo.factory;interface Product {void produce();
}

2)具体产品实现类A

package com.cheney.demo.factory;class ConcreteProductA implements Product {@Overridepublic void produce() {System.out.println("产品实现类A的produce()");}
}

3)具体产品实现类B

package com.cheney.demo.factory;class ConcreteProductB implements Product {@Overridepublic void produce() {System.out.println("产品实现类B的produce()");}
}

4)抽象工厂接口

package com.cheney.demo.factory;interface Factory {Product createProduct();
}

5)具体工厂实现类 A

package com.cheney.demo.factory;class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}

6)具体工厂实现类 B

package com.cheney.demo.factory;class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

在上述示例中,Product 是抽象产品接口,定义了产品的抽象方法。ConcreteProductAConcreteProductB 是具体产品的实现类。

Factory 是抽象工厂接口,定义了工厂方法的接口,负责创建产品的抽象方法。ConcreteFactoryAConcreteFactoryB 是具体工厂的实现类,分别负责创建 ConcreteProductAConcreteProductB

4. 应用示例

假设我们想要吃汉堡包,其中有不同类型的品牌,如肯德基、麦当劳等。我们可以使用工厂方法模式来管理不同类型产品的创建。

1)抽象产品接口

package com.cheney.demo.factory;interface Product {void makeHamburger();
}

2)具体产品实现类 - 肯德基

package com.cheney.demo.factory;class KfcProduct implements Product {@Overridepublic void makeHamburger() {System.out.println("肯德基的汉堡包");}
}

3)具体产品实现类 - 麦当劳

package com.cheney.demo.factory;class McDonaldSProduct implements Product {@Overridepublic void makeHamburger() {System.out.println("麦当劳的汉堡包");}
}

4)抽象工厂接口

package com.cheney.demo.factory;interface Factory {Product createProduct();
}

5)具体工厂实现类 - 肯德基工厂

package com.cheney.demo.factory;class KfcFactory implements Factory {@Overridepublic Product createProduct() {return new KfcProduct();}
}

6)具体工厂实现类 - 麦当劳工厂

package com.cheney.demo.factory;class McDonaldSFactory implements Factory {@Overridepublic Product createProduct() {return new McDonaldSProduct();}
}

在上述示例中,Product 是抽象产品接口,定义了产品的抽象方法。KfcProductMcDonaldSProduct 是具体产品的实现类。Factory 是抽象工厂接口,定义了工厂方法的接口,负责创建产品的抽象方法。KfcFactoryMcDonaldSFactory 是具体工厂的实现类,分别负责创建 KfcProductMcDonaldSProduct

在使用中,我们可以根据需要选择不同的工厂来创建不同类型的产品:

package com.cheney.demo.factory;public class Main {public static void main(String[] args) {// 创建肯德基工厂,并生成出一个汉堡包Factory phoneFactory = new KfcFactory();Product kfc = phoneFactory.createProduct();kfc.makeHamburger();// 创建麦当劳工厂,并生成出一个汉堡包Factory tvFactory = new McDonaldSFactory();Product m = tvFactory.createProduct();m.makeHamburger();}
}

执行结果

在这里插入图片描述

结语

工厂方法模式是一种常见且实用的设计模式,它通过定义一个工厂方法接口,将对象的实例化延迟到子类中,从而实现了客户端和具体类的解耦。在实际开发中,工厂方法模式常用于创建复杂对象、管理对象的生命周期等场景。通过灵活使用工厂方法模式,可以使系统更容易扩展和维护。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ Primer 6.3 返回类型和return语句 知识点+练习题

C Primer 6.3 返回类型和return语句 无返回值函数有返回值的函数两个错误值是如何被返回的返回类类型的函数和调用运算符引用返回左值列表初始化返回值主函数main的返回值返回数组指针 递归练习题疑问待更新 无返回值函数 用在返回值类型为void的函数中,可以不写re…

若依基于jsencrypt实现前后端登录密码加密

若依虽然有加密解密功能,然后只有前端有,在用户点击保存密码的时候,会将密码保存到本地,但是为了防止密码泄露,所以在保存的时候,进行加密,在回显密码的时候进行解密显示,用户在登录…

29 旋转工具箱

效果演示 实现了一个菜单按钮的动画效果,当鼠标悬停在菜单按钮上时,菜单按钮会旋转315度,菜单按钮旋转的同时,菜单按钮旋转的8个小圆圈也会依次旋转360度,并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反&#xff0…

数据结构期末复习(4)串 树和二叉树

串 在数据结构中,串是由零个或多个字符组成的有限序列。它是一种线性数据结构,常用于表示和处理文本、字符串等信息。 串的特点包括: 顺序性:串中的字符按照一定的先后顺序排列,每个字符都有一个唯一的位置。有限性&…

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器

系列文章目录 前言 本示例展示了如何利用非线性模型预测控制(MPC)为四旋翼飞行器设计一个跟踪轨迹的控制器。 一、四旋翼模型 四旋翼飞行器有四个向上的旋翼。从四旋翼飞行器的质量中心出发,旋翼呈等距离的正方形排列。四旋翼飞行器动力学数…

uboot工作原理介绍

uboot其实和电脑的BIOS是一个原理,它主要做两件事: (1)初始化硬件; (2)将系统文件(或者说是内核)从flash中读出来加载到DDR里面执行。 给大家解释下面几个问题: 为什么…

zabbix6.4设置网络设备端口流量P95

P95概念: p95函数写法: 需要监控P95的设备如下: 先找到原来的端口接收发送速率的监控项: 可以看到他们归属于自动发现规则:端口表UP 找到自动发现规则: 点击创建监控项原型: 公式如下&#xff…

吴恩达-从人类反馈中进行强化学习RLHF

吴恩达-从人类反馈中进行强化学习RLHF https://www.bilibili.com/video/BV1R94y1P7QX?p1&vd_sourcee7939b5cb7bc219a05ee9941cd297ade 1、公开的LLM,Llama2, 使用LLM对同一个提示产生多个不同输出,然后人类评估这些输出。评估方法是对比…

数据结构【树+二叉树】

目录 线性表和非线性表 树的概念 树的存储表示 二叉树的概念 特殊二叉树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 本篇我们开始进入数据结构中【树】的学习。 线性表和非线性表 逻辑结构:人想象出来的物理结构&#xf…

【昕宝爸爸小模块】浅谈之创建线程的几种方式

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

JVM实战(14)——Young GC调优

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

C++学习笔记——用C++实现树(区别于C)

树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例,并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…

B端产品经理学习-版本规划管理

首先我们回顾一下用户故事,用户故事有如下特点: PRD文档的特点则如下: B端产品中用户角色不同,需求侧重也不同 决策人——公司战略需求:转型升级、降本增效、品牌提升等 管理负责人——公司管理需求:提升…

翼龙-2H无人机

一、概述 翼龙-2,是成都飞机工业集团研制的无人驾驶飞行器,是空中侦察、精确打击和应急通讯的平台。成都飞机工业集团于2015年9月的北京国际航空航天展览会上介绍了翼龙-2的概念。在2016年珠海航展期间,翼龙-2的原型机首次向公众展示。 因为…

c#异形窗体遮罩效果

c#异形窗体遮罩效果,移动,关闭,最大化,最小化,还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…

构建Python随机密码生成器:保障账户安全的简易工具

密码安全是当前数字时代的一个重要议题。在保护个人信息和账户安全方面,安全且可靠的密码是至关重要的。本文将带您逐步了解如何使用Python创建一个随机密码生成器,以生成高强度、难以猜测的密码。 导言 在网络环境中,密码是保护个人账户和…

Linux网络文件共享服务1(基于FTP文件传输协议)

目录 一、了解FTP 1、FTP的相关概念 2、FTP的两种模式及工作原理 2.1 主动模式 2.2 被动模式 3、vsftpd 软件介绍 3.1 基础操作 4、vsftpd服务常见配置 4.1 修改默认命令端口 4.2 主动模式端口 4.3 被动模式端口 4.4 使用当地时间 4.5 匿名用户登录 4.6 匿名用户上…

c语言-库函数strstr()、strtok()、strerror()介绍

文章目录 前言一、库函数strstr()1.1 strstr()介绍1.2 strstr()模拟实现 二、库函数strtok()2.1 strtok()介绍 三、库函数strerror()3.1 strerror()介绍 总结 前言 本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 一、库函数strstr() 1.1 strstr()介绍 str…

基于ssm的线上旅游体验系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

Hive导入数据的五种方法

在Hive中建表成功之后,就会在HDFS上创建一个与之对应的文件夹,且文件夹名字就是表名; 文件夹父路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse; 也可以在建表的时候使用location语句指定…