工厂方法模式【Factory Method Pattern】

 前言

1.工厂模式概念


实例化对象,用工厂方法代替new操作(重点)
工厂模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展

2.什么情况下适合工厂模式

有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如果被创建、组合和表达的细节

女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这
个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛
蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到
都是静态的东西呀,怎么办?
别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,
具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
第一次烤泥人,兹兹兹兹~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!
第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,
黑人哪!
第三次烤泥人,兹~兹~兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人类! 
这个过程还是比较有意思的,先看看类图: 

 根据类图可以知道需要准备的类:

1.人类接口和对应实现

package factory1;/*** 定义一个人类接口* 首先定义什么是人类** @author 1*/
public interface Human {/*** 人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;*/public void laugh();/*** 人类还会哭,代表痛苦*/public void cry();/*** 人类会说话*/public void talk();
}
package factory1;/*** 黄种人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:15*/
public class YellowHuman implements Human {@Overridepublic void laugh() {System.out.println("黄色人类会大笑,幸福呀!");}@Overridepublic void cry() {System.out.println("黄色人类会哭");}@Overridepublic void talk() {System.out.println("黄色人类会说话,一般说的都是双字节");}
}

 

package factory1;/*** 白种人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:16*/
public class WhiteHuman implements Human {@Overridepublic void laugh() {System.out.println("白色人类会大笑,侵略的笑声");}@Overridepublic void cry() {System.out.println("白色人类会哭");}@Overridepublic void talk() {System.out.println("白色人类会说话,一般都是但是单字节!");}
}
package factory1;/*** 黑人** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:17*/
public class BlackHuman implements Human {@Overridepublic void laugh() {System.out.println("黑人会笑");}@Overridepublic void cry() {System.out.println("黑人会哭");}@Overridepublic void talk() {System.out.println("黑人可以说话,一般人听不懂");}
}

 2.八卦炉

package factory1;import java.util.List;
import java.util.Random;/*** 造人工厂* 女娲造人的故事:** @author 1* @version 1.0* @description: 很久很久以前,盘古开辟了天地,用身躯造出日月星辰、山川草木,天地一片繁华* 一天,女娲下界走了一遭,哎!太寂寞,太孤独了,没个会笑的、会哭的、会说话的东东* 那怎么办呢?不用愁,女娲,神仙呀,造出来呀,然后捏泥巴,放八卦炉(后来这个成了太白金星的宝* 贝)中烤,于是就有了人:* 我们把这个生产人的过程用Java程序表现出来:* @date 2023/8/15 17:19*/
public class HumanFactory {/*** 定义一个八卦炉子** @param c* @return*/public static Human createHuman(Class c) {//定义一个类型的人类Human human = null;try {//生产一个人类human = (Human) Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {System.out.println("必须指定人类颜色");} catch (IllegalAccessException e) {System.out.println("定义的人类错误");} catch (ClassNotFoundException e) {System.out.println("定义的人类找不到");}return human;}/*** 女娲生气了,把一团泥巴塞到八卦炉,哎产生啥人类就啥人类** @return*/public static Human createHuman() {//定义一个类型的人类Human human = null;//首先是获得有多少个实现类,多少个人类//定义了多少人类List<Class> concreteHumanList =ClassUtils.getAllClassByInterface(Human.class);//八卦炉自己开始想烧出什么人就什么人Random random = new Random();int rand = random.nextInt(concreteHumanList.size());human = createHuman(concreteHumanList.get(rand));return human;}
}

批量工具类:主要实现根据接口查找实现类(属于扩展知识)

package factory1;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;/*** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:48*/
@SuppressWarnings("all")
public class ClassUtils {//给一个接口,返回这个接口的所有实现类public static List<Class> getAllClassByInterface(Class c){List<Class> returnClassList = new ArrayList<Class>(); //返回结果//如果不是一个接口,则不做处理if(c.isInterface()){String packageName = c.getPackage().getName(); //获得当前的包名try {//获得当前包下以及子包下的所有类List<Class> allClass = getClasses(packageName);//判断是否是同一个接口for(int i=0;i<allClass.size();i++){if(c.isAssignableFrom(allClass.get(i))){ //判断是不是一个接口if(!c.equals(allClass.get(i))){ //本身不加进去returnClassList.add(allClass.get(i));}}}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return returnClassList;}//从一个包中查找出所有的类,在jar包中不能查找private static List<Class> getClasses(String packageName)throws ClassNotFoundException, IOException {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();String path = packageName.replace('.', '/');Enumeration<URL> resources = classLoader.getResources(path);List<File> dirs = new ArrayList<File>();while (resources.hasMoreElements()) {URL resource = resources.nextElement();dirs.add(new File(resource.getFile()));}ArrayList<Class> classes = new ArrayList<Class>();for (File directory : dirs) {classes.addAll(findClasses(directory, packageName));}return classes;}private static List<Class> findClasses(File directory, String packageName)throws ClassNotFoundException {List<Class> classes = new ArrayList<Class>();if (!directory.exists()) {return classes;}File[] files = directory.listFiles();for (File file : files) {if (file.isDirectory()) {assert !file.getName().contains(".");classes.addAll(findClasses(file, packageName + "." +file.getName()));} else if (file.getName().endsWith(".class")) {classes.add(Class.forName(packageName + '.' +file.getName().substring(0, file.getName().length() - 6)));}}return classes;}
}

女娲类

 

package factory1;/*** 女娲** @author 1* @version 1.0* @description: TODO* @date 2023/8/15 17:28*/
public class NvWa {public static void main(String[] args) {System.out.println("(1)女娲第一次造人,火候不足,白人----------------");Human witheHuman = HumanFactory.createHuman(WhiteHuman.class);witheHuman.talk();witheHuman.laugh();witheHuman.cry();System.out.println("(2)女娲第二次造人,火候加足点,然后又出了个次品,黑人------------------");Human blackHuman = HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();System.out.println("(3)女娲第三次造人,这次火候掌握的正好,黄色人类-----------------");Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk();System.out.println("(4)女娲让八卦炉随机造人------------------");for (int i = 0; i < 10; i++) {System.out.println("随机产生人类*******" + i);Human human = HumanFactory.createHuman();human.cry();human.laugh();human.talk();}}
}

运行结果

(1)女娲第一次造人,火候不足,白人----------------
白色人类会说话,一般都是但是单字节!
白色人类会大笑,侵略的笑声
白色人类会哭
(2)女娲第二次造人,火候加足点,然后又出了个次品,黑人------------------
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
(3)女娲第三次造人,这次火候掌握的正好,黄色人类-----------------
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节
(4)女娲让八卦炉随机造人------------------
随机产生人类*******0
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******1
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节
随机产生人类*******2
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******3
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******4
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******5
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******6
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!
随机产生人类*******7
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******8
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂
随机产生人类*******9
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!

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

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

相关文章

Vue中实现自动匹配搜索框内容 关键字高亮文字显示

实现效果如下: 1.首先需要给输入框进行双向绑定 2.拿到搜索的结果去渲染页面 将返回的结果和搜索的关键字进行比对 如果相同的 就变红 上代码 html部分 //输入框<div class"search"><div class"shuru"><input type"请输入要查询的…

Springboot + Vue ElementUI 实现MySQLPostgresql可视化

一、功能展示&#xff1a; PostgreSQL教程--实现类似于MySQL的show create table功能实现见末尾 效果如图&#xff1a; DB连接配置维护&#xff1a; Schema功能&#xff1a;集成Screw生成文档&#xff0c;导出库的表结构&#xff0c;导出表结构和数据 表对象操作&#xff1a;…

【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池&#xff08;Object Pool&#xff09;是一种软件设计模式&#xff0c;用于管理和重用已创建的对象。在对象池中&#xff0c;一组预先创建的对象被维护在一个池中&#xff0c;并在需要时…

阿里云ECS服务器和轻量应用服务器区别?怎么选择?

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

浅析DIX与DIF(T10 PI)

文章目录 概述DIF与DIX端到端数据保护 DIFDIF保护类型 SCSI设备支持DIFStandard INQUIRY DataExtended INQUIRY Data VPD pageSPT字段GRD_CHK、APP_CHK、REF_CHK字段 READ CAPACITY(16)响应信息 SCSI命令请求读命令请求写命令请求 DIF盘格式化相关参考 概述 DIF与DIX DIF&…

【机器学习6】数据预处理(三)——处理类别数据(有序数据和标称数据)

处理类别数据 &#x1f331;简要理解处理类别数据的重要性☘️类别数据的分类☘️方便研究——用pandas创建包含多种特征的数据集&#x1f340;映射有序特征&#x1f340;标称特征标签编码&#x1f340;标称特征的独热编码&#x1f331;独热编码的优缺点 &#x1f331;简要理解…

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…

MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

面试官问 &#xff1a;索引为什么使用 B 树&#xff0c;而不使用 B 树&#xff0c;不使用红黑树呢 首先 B 树和 B 树 都是多叉搜索树&#xff0c;然后我们先来观察一下 B 树和 B 树的数据结构&#xff1a; B 树的数据结构实现 >> B 树的数据结构实现 >> 【B 树相…

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型&#xff1a;动态规划 难度&#xff1a;medium 思路&#xff1a; 应用二维数组的动态规划&#xff0c;到达某个方格的方法数目&#xff0c;为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

08.SpringBoot请求相应

文章目录 1 请求1.1 Postman1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2 响应2.1 ResponseBody注解2.2 统一响应结果…

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…

收集的一些比较好的git网址

1、民间故事 https://github.com/folkstory/lingqiu/blob/master/%E4%BC%A0%E8%AF%B4%E9%83%A8%E5%88%86/%E4%BA%BA%E7%89%A9%E4%BC%A0%E8%AF%B4/%E2%80%9C%E6%B5%B7%E5%BA%95%E6%8D%9E%E6%9C%88%E2%80%9D%E7%9A%84%E6%AD%A6%E4%B8%BE.md 2、童话故事 https://gutenberg.org/c…

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…

C# 观察者模式

一、概述 观察者模式是一种常用的设计模式&#xff0c;它属于行为型模式。在C#中&#xff0c;观察者模式通过定义一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合&#xff0c;…

Ribbon负载均衡

Ribbon与Eureka的关系 Eureka的服务拉取与负载均衡都是由Ribbon来实现的。 当服务发送http://userservice/user/xxxhtt://userservice/user/xxx请求时&#xff0c;是无法到达userservice服务的&#xff0c;会通过Ribbon会把这个请求拦截下来&#xff0c;通过Eureka-server转换…

常见排序集锦-C语言实现数据结构

目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#…

排名前 6 位的数学编程语言

0 说明 任何对数学感兴趣或计划学习数学的人&#xff0c;都应该至少对编程语言有一定的流利程度。您不仅会更有就业能力&#xff0c;还可以更深入地理解和探索数学。那么你应该学习什么语言呢&#xff1f; 1.python 对于任何正在学习数学的人来说&#xff0c;Python都是一门很棒…

【Linux从入门到精通】动静态库的原理与制作详解

本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释&#xff0c;希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、1 静态…

编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战

什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式&#xff0c;在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程&#xff08;OOP&#xff09;的替代品&#xff0c;而是 OOP 的补充和扩展。它是一个新的维度&#xff0c;用来表达横切问题&a…