设计模式--简单工厂方法

news/2024/5/17 15:20:23/文章来源:https://www.cnblogs.com/52-IT-y/p/16648243.html

简介

简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式通过定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,这个父类具有共有的属性和方法。因在简单工厂模式中用于创建实例的方法通常是静态方法,因此也称为静态工厂方法模式

  • Product 表示产品接口,也可用抽象类实现,封装产品间共有的属性

  • ProductA、ProductB 表示具体的实际产品

  • Factory 表示工厂,工厂根据需要来创建相应的产品

这样一来,当添加新的 ProductC 时,只需要修改工厂部分代码即可,而传统方法需要在每一个创建产品的地方都进行修改


实现

  • 产品接口
    • public interface Product {void display();
      }
  • 产品接口实现子类
    • 产品A类

      public class ProductA implements Product {@Overridepublic void display() {System.out.println("This is product A");}
      }
    •  产品B类
      public class ProductB implements Product {@Overridepublic void display() {System.out.println("This is product B");}
      }
  •  简单工厂类
    • public class Factory {/*** 方式一:根据名称创建具体的日志记录器* @param type* @return*/public static Product createProductByType(String type){Product product = null;if ("ProductA".equals(type)) {product = new ProductA();} else if ("ProductB".equals(type)) {product = new ProductB();}return product;}/*** 通过反射创建日志记录器* @param cls* @return*/public static Product createProductByClass(Class cls){Product product = null;try {product = (Product) Class.forName(cls.getName()).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return product;}
      }
  • 测试
    • public class Test {public static void main(String[] args) {Product productA = Factory.createProductByType("ProductA");Product productB = Factory.createProductByType("ProductB");productA.display();productB.display();System.out.println("----------------------------------------");productA = Factory.createProductByClass(productA.getClass());productB = Factory.createProductByClass(productB.getClass());productA.display();productB.display();}
      }
      This is product A
      This is product B
      ----------------------------------------
      This is product A
      This is product B

优势和缺点

优势

  • 将创建实例与使用实例分开,使用者不必关心类对象创建细节,实现了解耦

缺点

  • 违背开闭原则,一旦添加新产品就得修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂
  • 由于使用了静态方法,静态方法不能被继承和重写,会造成工厂类无法继承

应用场景

  • 工厂类负责创建的产品对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
  • 客户端对于如何创建对象细节不关心:客户端不需要关心创建细节,只需要传输所对应的参数即可

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

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

相关文章

SpringBoot整合Flowable工作流引擎框架

Flowable工作流引擎框架介绍 一个Java编写的轻量级业务流程引擎,为开发人员、系统管理员和业务用户提供工作流和业务流程管理(BPM)平台。不仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有自己的用户管理、微服务…

新机器(禁止上网)安装vscode及公钥方式登陆linux

1.1 新机器(禁止上网)安装vscode 注意:以下三个程序版本必须一至。 1) vscodeWin10安装程序 2) win10插件(ssh客户端) 3) linux里vscode-server-linux-x64.tar.gz(ssh服务端)方法一:从原桌面直接copy文件夹(绿色)转移到新机器 方法二:安装新的VSCodeUserSetup-x64-1.70.2.ex…

macOS分发app打包+签名+公证+添加票据+生成dmg文件

1.打包 网上有很多使用命令行的打包的方式大家可自行查找,以下是使用Xcode进行打包. 首先配置证书要配置Developer ID Application证书然后使用的是Xcode进行打包:Product->Archive 这种打包方式的好处是省去了签名的过程,但是用网上其他人的命令查看签名时候还是未成功&a…

lararvel学习文档

学习文档 http://laravel.p2hp.com/ http://laravel.p2hp.com/cndocs/9.x/eloquent#generating-model-classes laravel9.x https://learnku.com/docs/laravel/9.x laravel8.5 https://learnku.com/docs/laravel/8.5 laravel8.x https://learnku.com/docs/laravel/8.x …

CentOS7安装MySQL(完整版)

在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1 下载并安装MySQL官方的 Yum Repository [rootlocalhost ~]# wget -i -c http://dev.mysql.com…

最新小红书数据 小红书爬虫 小红书接口 xhs 小红书算法 小红书api

最新版小红书APP接口,需要交流的朋友联系,少量勿扰,谢谢! 只取APP公开数据,不做违法事情,如有侵犯贵公司,请联系删除! 博主详情 笔记详情 博主笔记列表 笔记评论 关键词搜索等等接口已部署,支持并发,可测试!

openmmlab 教程1-安装

文章目录openmmlab 教程11. 安装1.1 介绍1.2 安装1) 安装mmcv-full(建议)2) 安装mmseg3) mmcv-full和mmcv区别1.3 验证安装成功1) 源码安装2) pip 安装openmmlab 教程1 官方文档 安装 MMCV — mmcv 1.6.1 文档 依赖 — MMSegmentation 0.27.0 文档 笔记链接 https://gitee.co…

windows安装JDK与系统变量配置

目录 问题现象: 解决方法: 1、安装 2、系统变量配置 2.1、JAVA_HOME 2.2、Path 2.3、CLASSPATH 问题现象: 今天梳理了一下JDK的安装和系统变量配置! 解决方法: 1、安装 双击下载好的jdk安装包: 安装…

【区块链 | 默克尔树】如何利用Merkle实现空投,像Uniswap一样使用Merkle执行Airdrop

如果你想直接跳过如何实现 Uniswap Airdrop,请继续阅读以下部分:创建 Merkle Airdrop 的步骤 图片来自 https://ccoingossip.com/what-is-airdrop-in-crypto-world/ Airdrop Airdrop 是指项目决定向一组用户分发代币的事件。以下是实现 Airdrop 的一些潜在方法: 1. 管理员…

2.1 Elasticsearch DSL搜索-数据准备

自定义词库建立索引dsl_search(名字随意)手动建立mappingsPOST /dsl_search/_mapping { "properties": { "id": { "type": "long" }, "age": { "type&quo…

High Performance Computing 综述

文章目录OverviewHeterogeneous ComputingMPI (Message Passing Interface)ConcurrencyMulti-ProcessingIPCMulti-ThreadingCPUCPU InfoARM CPU featuresCPU BenchmarkSysbenchhtop压力测试CPU Instructions & IntrinsicsAssemblySIMDIntel MMX & SSEARM NEONConverter…

DoozyUI⭐️十六、Progressor Group:可视化帮手,进度条组自动求平均值

文章目录 🟥 效果展示🟧 实现过程1️⃣ 建立四个进度条2️⃣ 建立进度条组Progressor Group3️⃣ 运行看看效果吧Progressor Group,进度器组,它可以自动计算所有引用的进度器的进度值的平均值。 🟥 效果展示 下图Gif所示,下方的共5个进度条,下方的4个共同控制了最上…

redux太繁琐?一文入门学会使用mobx简化项目的状态管理

一、mobx基本介绍 mobx是一个简单、可扩展状态工具,相比redux,具有以下特点 简洁、无模板代码(redux需要写大量模板代码)响应式数据,可直接修改(redux需要保证不可变)可直接处理异步&#xff…

Ubuntu1604从0安装CUDA

港澳 2020年12月31日 目录通过安装CUDA来安装驱动先安装驱动禁用第三方驱动、卸载初始驱动、关闭图形界面再安装CUDA卸载CUDA安装Tensorflow安装VSCode和Requirements包InternalError: Dst tensor is not initialized实时监测GPU状态demo运行结果重要参考通过安装CUDA来安装驱动…

自动控制原理6.5---复合校正

参考书籍:《自动控制原理》(第七版).胡寿松主编. 《自动控制原理PDF版下载》 5.复合校正 5.1 按扰动补偿的复合校正 如果在系统的反馈控制回路中加入前馈通路,组成一个前馈控制和反馈控制相组合的系统,只要系统参数选择得当,既可…

Nginx -- SSL模块

目录 一、什么是ssl证书 二、证书的作用 1.浏览器绿色安全标志 2.网站数据加密传输 3.安全标志获得访客信任 4.强大的加密等级保障 5.SSL证书帮助网站保护了用户和网站之间的任何数据的安全 三、SSL证书的类别 1.按照验证方式 2.按照一张SSL证书保护的域名数 3.按照 …

虚拟土地+VRGDA:一种可持续的元宇宙土地销售策略

元宇宙可能刚刚开始形成,但虚拟土地危机已经存在 30 年了。 有啥问题?在稀缺性方面,让虚拟土地过于接近实体土地会导致经济问题,从而扼杀游戏和虚拟世界的发展。 我在今年早些时候写了一篇关于这个话题的文章,并指出…

NettyNIO

什么是Netty Netty是由JBOSS提供的一个开源框架,现为Github上的独立项目,Netty是一个异步的、基于事件驱动的网路应用框架,用以快速开发高性能、高可靠性的网络IO程序。Netty主要针对于TCP协议下,面向Clients端的高并发应用&…

Hive中的数据倾斜优化

数据倾斜一.概述何为数据倾斜导致的问题二.优化group by 数据倾斜join 数据倾斜一.概述 何为数据倾斜 运行的过程当中,有多个Reduce,每个Reduce拿到的数据不均匀,其中有一个或几个拿到的数据远远大于其他reduce拿到的数量,此时任…

SpringMvc(二、请求传参

一、常见参数种类 普通参数实体类参数嵌套实体类参数数组类型参数集合类型参数 1,普通参数 /*** 直接用形参传递即可,若请请求参数和形参名称不同,用RequestParam(value)指定* return*/ResponseBodyRequestMapping("/add")public …