java设计模式-工厂方法模式

news2024/9/22 23:25:49

1.工厂方法(FactoryMethod)模式的定义

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

2.工厂方法模式的主要优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

3.工厂方法模式主要角色

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

4.工厂方法模式结构图

在这里插入图片描述

5.工厂方法模式的实现

5.1 普通工厂模式,以消息发送为例

  • 创建消息发送接口
package com.lw.designpattern.factorymethod.normal;

/**
 * @Classname Sender
 * @Description 消息发送接口
 * @Author lw
 * @Date 2019-12-21 15:24
 */
public interface Sender {

    public void send();
}
  • 创建邮件发送类,实现Sender接口
package com.lw.designpattern.factorymethod.normal;

/**
 * @Classname MailSender
 * @Description 邮件发送
 * @Author lw
 * @Date 2019-12-21 15:25
 */
public class MailSender implements Sender {

    @Override
    public void send() {
        System.out.println("邮件发送。。。。。。");
    }
}
  • 创建短信发送类,实现Sender接口
package com.lw.designpattern.factorymethod.normal;

/**
 * @Classname SmsSender
 * @Description 短信发送
 * @Author lw
 * @Date 2019-12-21 15:26
 */
public class SmsSender implements Sender {

    @Override
    public void send() {
        System.out.println("短信发送。。。。。。");
    }
}

如果后续有其他方式消息发送,则只需要创建消息发送类,实现Sender接口即可。违背开闭原则

  • 测试代码
 /**
   * 工厂设计模式-普通工厂模式
   */
  @Test
  public void testNormalFactory(){
      // 邮件发送
      Sender sender = new MailSender();
      sender.send();
      // 短信发送
      Sender sender1 = new SmsSender();
      sender1.send();
  }
  • 打印结果
    在这里插入图片描述

5.2 工厂方法模式,以饮料产品及生产为例

  • 创建饮料产品接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname DrinksProduct
 * @Description 饮料产品接口
 * @Author lw
 * @Date 2019-12-21 14:22
 */
public interface DrinksProduct {

    public void show();
}
  • 创建可乐产品类,实现DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname ColaProduct
 * @Description 可乐产品
 * @Author lw
 * @Date 2019-12-21 14:30
 */
public class ColaProduct implements DrinksProduct {

    @Override
    public void show() {
        System.out.println("可乐产品显示。。。。。。");
    }
}
  • 创建雪碧产品类,实现DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname SpriteProduct
 * @Description 雪碧产品
 * @Author lw
 * @Date 2019-12-21 14:31
 */
public class SpriteProduct implements DrinksProduct {

    @Override
    public void show() {
        System.out.println("雪碧产品显示。。。。。。");
    }
}
  • 创建饮料工厂接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname DrinksFactory
 * @Description 饮料工厂接口
 * @Author lw
 * @Date 2019-12-21 15:04
 */
public interface DrinksFactory {

    public DrinksProduct product();
}
  • 创建可乐工厂类,实现DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname ColaFactory
 * @Description 可乐工厂
 * @Author lw
 * @Date 2019-12-21 15:05
 */
public class ColaFactory implements DrinksFactory {

    @Override
    public DrinksProduct product() {
        System.out.println("开始生产可乐。。。。。。");
        return new ColaProduct();
    }
}
  • 创建雪碧工厂类,实现DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;

/**
 * @Classname SpriteFactory
 * @Description 雪碧工厂
 * @Author lw
 * @Date 2019-12-21 15:05
 */
public class SpriteFactory implements DrinksFactory {

    @Override
    public DrinksProduct product() {
        System.out.println("开始生产雪碧。。。。。。");
        return new SpriteProduct();
    }
}

后续增加其他产品,则需要增加一个具体产品类和一个对应的具体工厂类即可。满足开闭原则。

  • 测试代码
/**
  * 工厂设计模式-工厂方法模式
  */
 @Test
 public void testFactoryMethod(){
     // 生产可乐
     DrinksFactory drinksFactory = new ColaFactory();
     DrinksProduct drinksProduct = drinksFactory.product();
     drinksProduct.show();
     // 生产雪碧
     DrinksFactory drinksFactory1 = new SpriteFactory();
     DrinksProduct drinksProduct1 = drinksFactory1.product();
     drinksProduct1.show();
 }

打印结果
在这里插入图片描述

6.工厂方法模式的应用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的品牌。

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

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

相关文章

黑色翻页时钟HTML源码-倒计时单页翻页时钟

黑色翻页时钟HTML源码-倒计时单页翻页时钟这是一个类似fliqlo的黑色翻页时钟HTML源码,它仅包含一个HTML文件,上传到网站后即可使用。该时钟具有查看当前时间、秒表和倒计时功能,并且可以在页面的右下角进行设置。 红色动态炫酷数字时钟html网…

怎么解决bash: composer: command not found问题

是不是遇到过bash: composer: command not found问题,怎么解决呢?下面由composer教程栏目给大家来详细介绍该问题的解决方法。 1、先看报错 2、由于错误的原因,安装很多东西都失败了。网上有的说是环境变量的问题,又一个个找也没…

2021年数维杯国际大学生数学建模D题2021年电影市场票房波动模型分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 D题 2021年电影市场票房波动模型分析 原题再现: 1、电影票房预测建模背景   随着人们文化消费需求的增加,电影院和银幕的数量不断增加,我国的电影产业不断呈现出繁荣景象。2019年,全国电影票房…

java设计模式学习之【享元模式】

文章目录 引言享元模式简介定义与用途实现方式 使用场景优势与劣势在Java中的应用享元模式在Spring中的应用画图示例代码地址 引言 想象一下,您正在开发一个游戏,游戏中有成千上万的树木和建筑。如果每个对象都独立存储它的所有数据,将会占用…

前端路由钩子的神奇之处:你真的了解它们吗?(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

JAVAEE大型金融支付-第1章-讲义-项目介绍

第1章 讲义-项目介绍与环境搭建 1.项目背景 1.1 项目背景 随着移动支付的盛行,商业银行、第三方支付公司、其它清算机构、消费金融公司等众多类型的机构,都在为商户 提供网络(移动)支付解决方案。另一方面,用户的支…

狗dog目标检测数据集VOC+YOLO格式1W+张

狗,是食肉目犬科 [11]犬属 [13]哺乳动物 [12],别称犬,与马、牛、羊、猪、鸡并称“六畜” [13]。狗的体型大小、毛色因品种不同而不同,体格匀称;鼻吻部较长;眼呈卵圆形;两耳或竖或垂;…

RTX 40 SUPER发布时间定了!价格也有了

快科技12月16日消息,NVIDIA RTX 40 SUPER系列显卡基本确定将在2024年1月8日正式发布,也就是CES 2024大展期间,随后在1月中下旬陆续解禁上市。 RTX 4070 SUPER 1月16日解禁公版/原价丐版,1月17日解禁高价高配版,上市开…

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核,其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1),但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例,其输入频率FCLKIN50MHz,要输出80MHz&am…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具,它能够帮助用户更好地了解和使用产品,提高用户体验。然而,创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法,帮助企业更好地为…

【C++干货铺】会搜索的二叉树(BSTree)

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 前言: 二叉搜索树 二叉搜索树概念 二叉搜索树操作 二叉搜索树的查找 二叉搜索树的插入 二叉搜索树元素的删除 ​二叉搜索树的实现 BSTree结点 …

C#学习笔记 - C#基础知识 - C#从入门到放弃

C# 持续更新中~~ 上次更新日期:20231215 第1节 C# 简单介绍1.1 C# 是什么1.2 C# 强大的编程功能1.3 C# 发展史1.4 C#与Java区别 第2节 C#基本语法2.1 C#程序结构2.2 C# 结构解析2.3 命名空间及标识符、关键字2.3.1 别名的使用2.3.2 标识符2.3.3 C#关键字 第3节 变量…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用,导致密码忘记了,这可咋整? 第1步:取出SD卡 将树莓派关机,移除sd卡,使用读卡器,插入到你的电脑。 第2步:编辑 cmdline.txt 在PC上打开SD卡根目录,启动…

windows电脑半夜突然睡眠自动唤醒的问题查找与治理

遇见几次了,半夜起来上厕所,发现休眠的电脑居然自己开了,还得跑过去把电脑再休眠,很烦。昨天晚上居然自动唤醒两次,忍无可忍了,于是开始查找原因。 查询原因如下,解决方面也在后面。 固件 S3 计…

电子元器件-电阻

电阻 采样限流定时保护上拉 链接: 另类方式讲电阻! 采样 应用场景,如我们在调节汽车座椅的过程中,如果座椅的行程达到尽头,此时控制座椅运动的电机就会停止,因而导致电机的电流非常大。如果正常运转的电流为1A&#…

大家都崩,美团不崩:其高可用架构,巧夺天工!

说在前面 在40岁老架构师尼恩的50读者群中,一直在指导大家简历,指导大家职业升级。 前几天,指导了一个40岁老伙伴拿到年薪100W offer,小伙伴的优势在异地多活。 在简历指导的过程中,尼恩发现: 异地多活的…

alibaba druid连接池

alibaba druid连接池 如果是SpringBoot 3.x,使用以下依赖 com.alibaba druid-spring-boot-3-starter ${druid-spring-boot-starter.version} application.yml配置 登录页面配置 切面监控springboot类 对 Web 请求的监控 配置filter,收集统计信息&#x…

DevEco Studio中配置代码片段

进入设置(快捷键CtrlAltS) 选择Editor > Live Templates 添加片段 其中 $END$ 代表光标首次出现位置 一定要选择适用语言!!! 最后Apply > OK 即可,输入快捷命令回车即可快速生成代码片段。

权重衰减(Weight Decay)

在深度学习中,权重衰减(Weight Decay)是一种常用的正则化技术,旨在减少模型的过拟合现象。权重衰减通过向损失函数添加一个正则化项,以惩罚模型中较大的权重值。 一、权重衰减 在深度学习中,模型的训练过程…

Flutter在Visual Studio Code上首次创建运行应用

一、创建Flutter应用 1、前提条件 安装Visual Studio Code并配置好运行环境 2、开始创建Flutter应用 1)、打开Visual Studio Code 2)、打开 View > Command Palette。 3)、在搜索框中输入“flutter”,弹出内容如下图所示,选择“ Flutter: New Pr…