《Design Patterns》FactoryMethod.积跬步系列

2023-05-16

FactoryMethod:工厂方法模式

先代码

父类或接口类:

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: Demo--简单工厂模式
 * SuperClassOrInterface:表示父类或者接口都行,此处两者代码都会给出,大同小异
 */
/*public abstract class SuperClassOrInterface {
	// 抽象方法
	public abstract void doSomeThings();
	// 非抽象方法
	public void doThings(){
		System.out.println("SuperClassOrInterface:doThings...");
	}
}*/
public interface SuperClassOrInterface{
	public void doSomeThings();
}

子类或实现类(两个):

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子类1:继承或实现
 */
/*public class SubClassOrImplClass1 extends SuperClassOrInterface {

	*//**
	 * 实现抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
	*//**
	 * 子类重写父类方法
	 * @Override 可以校验该方法是不是在父类(超类)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass1:doThings...");
	}
}*/
public class SubClassOrImplClass1 implements SuperClassOrInterface {

	/**
	 * 实现接口中指定的行为
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
}
package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子类2:继承或实现
 */
/*public class SubClassOrImplClass2 extends SuperClassOrInterface {
	*//**
	 * 实现抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
	*//**
	 * 子类重写父类方法
	 * @Override 可以校验该方法是不是在父类(超类)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass2:doThings...");
	}
}*/
public class SubClassOrImplClass2 implements SuperClassOrInterface {

	/**
	 * 实现接口中指定的行为
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
}

抽象工厂或接口工厂:

package h.ldemo.factorymethod;

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年2月15日
 * @Description: 抽象工厂或接口工厂
 */
public abstract class SuperFactoryOrFactoryInterface {
	// 此处以抽象类为例,接口方式类似
	// 获取实例
	public abstract SuperClassOrInterface getInstance();
}

抽象工厂或接口工厂子类(举例两个):

package h.ldemo.factorymethod;

public class SubFactoryOrFactoryImpl1 extends SuperFactoryOrFactoryInterface {

	@Override
	public SuperClassOrInterface getInstance() {
		// TODO Auto-generated method stub
		System.out.println("具体工厂1实例化-->具体对象1...");
		return new SubClassOrImplClass1();
	}

}
package h.ldemo.factorymethod;

public class SubFactoryOrFactoryImpl2 extends SuperFactoryOrFactoryInterface {

	@Override
	public SuperClassOrInterface getInstance() {
		// TODO Auto-generated method stub
		System.out.println("具体工厂2实例化-->具体对象2...");
		return new SubClassOrImplClass2();
	}

}

测试类:

package h.ldemo.factorymethod;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 测试
 */
public class TestMainEnter {

	public static void main(String[] args) {
		SuperFactoryOrFactoryInterface superFactory = new SubFactoryOrFactoryImpl1();
		superFactory.getInstance().doSomeThings();
		System.out.println("---------------------");
		superFactory = new SubFactoryOrFactoryImpl2();
		superFactory.getInstance().doSomeThings();
	}

}

测试结果:
在这里插入图片描述

后分析

  • 个人建议:写代码是件幸福的事,So,do it

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂VS工厂方法:
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。如简单工厂模式博客中讲的计算机的例子,你完成了加减乘除,但你需要计算次方的时候,你还需要对工厂进行修改,添加对应的case,这可不是一个好办法,就等于说,他们不但对扩展开放了,对修改也开放了,这个就违背了开放-封闭原则。那么工厂模式就发挥作用了。如上述代码所写的,我们每添加一个新的功能,只需要增加具体类和相应的工厂类即可,这就满足了开闭原则。
总结:工厂方法模式克服了简单工厂模式违背的开放-封闭原则的缺点,又保持了封装对象创建过程的优点。使得更换对象时,不需要做太大的改动就可以实现,降低了客户程序与产品对象的耦合。可以说,工厂方法是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但工厂方法模式本身也存在瑕疵,由于每增加一个产品,就要添加一个产品工厂类,增加了额外的开发量。

其他例子:参考自《大话设计模式》雷锋工厂


注:以上文章仅是个人总结,若有不当之处,望不吝赐教

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Design Patterns》FactoryMethod.积跬步系列 的相关文章

  • linux服务器硬盘IO读写负载查看

    文章目录 1 首先top命令看下2 xff0c 先用iostat查看磁盘io 是否读写负载很高重要指标 xff1a 3 找出占用io高的进程的工具 iotopIO负荷的压力测试 最近在用spark 向MySQL 倒腾数据 xff0c 发现s
  • PreparedStatement与Statement的区别及优势

    PreparedStatement是用来执行SQL查询语句的API之一 xff0c Java提供了 Statement PreparedStatement 和 CallableStatement三种方式来执行查询语句 xff0c 其中 St
  • Mac Idea卡顿、慢解决方案 限制jvm也没有用【超实用】

    前置 Mac使用idea卡顿 不流畅解决方案 xff0c 设置了jvm也没有用 快捷键提示超级慢的问题 导致原因 下载的软件版本问题 去下载标注的版本就变得非常的流畅 xff0c 超级快 版本说明 xff1a 第一个是英特尔芯片的软件 第二
  • HDFS 启动与关闭

    一 HDFS 启动与关闭 HDFS 和普通的硬盘上的文件系统不一样 xff0c 是通过Java 虚拟机运行在整个集群当中的 xff0c 所以当Hadoop 程序写好之后 xff0c 需要启动HDFS 文件系统 xff0c 才能运行 HDFS
  • Android快速入门之通过Fragment实现底部菜单栏

    早期Android应用通常使用TabHost实现页面之间的切换 xff0c 现在更多的选择ViewPager与Fragment结合的方式实现页面切换 Android提供了专门的适配器 FragmentPagerAdapter和Fragmen
  • Zemax操作35--双高斯镜头优化

    要求 xff1a 双高斯镜头是传统的单反相机镜头 相对孔径 xff1a 1 3 焦距 xff1a 75mm 可见光 视场由一个圆定义 xff0c 圆的直径是胶片的对角线 xff0c 像高21 6mm 畸变小于1 玻璃的边界条件最小边缘 中心
  • C/C++编程题之删除字符串中出现次数最少的字符

    在牛客上刷到删除字符串中出现次数最少的字符 xff0c 现在将通过的代码贴一下 xff0c 供大家参考 实现删除字符串中出现次数最少的字符 xff0c 若多个字符出现次数一样 xff0c 则都删除 输出删除这些单词后的字符串 xff0c 字
  • springboot解决servlet-api-2.5.jar和tomcat-embed-core-9.0.46.jar冲突

    2022 11 04 18 07 52 869 ERROR 86604 restartedMain o s b d LoggingFailureAnalysisReporter APPLICATION FAILED TO START Des
  • PS 修改图片大小

    平常的网络世界中 xff0c 会有一些高清晰的图片出现 xff0c 哦不 xff0c 现在的图片越来越超清了 xff1b 那么 xff0c 就需要对它们大小进行修改 xff0c 不然内存伤不起啊 xff01 以下是三种常用的方法 1 修改图
  • 将若依(RuoYI)项目打包(jar)部署到Linux服务器(详细步骤)

    第一步下载maven方便将RuoYi项目打包 1 下载网址 xff1a http maven apache org download cgi 2 3 下载3 6 3版本 解压完成后 将文件夹名称修改为maven 第二步配置maven环境变量
  • 最通俗易懂的乐观锁与悲观锁原理及实现

    一 乐观锁 总是认为不会产生并发问题 xff0c 每次去取数据的时候总认为不会有其他线程对数据进行修改 xff0c 因此不会上锁 xff0c 但是在更新时会判断其他线程在这之前有没有对数据进行修改 xff0c 一般会使用版本号机制或CAS操
  • 3.12生产者消费者模型(pthread_cond_t、sem_t)

    生产者消费者模型 生产者不能在容器满了继续生产 消费者不能在容器为空的时候消费 生产者消费者模型 粗略的版本 include lt stdio h gt include lt pthread h gt include lt stdlib h
  • ActiveMQ中Topic模式队列和Queue模式队列区别

    Topic和Queue是ActiveMQ两种消息模式 Topic用于消息订阅 xff0c 属于一对多 xff1b Queue用于消息处理 xff0c 属于一对一 分别从工作模式 有无状态 传递完整性 处理效率四个方面比较 工作模式 xff1
  • Java SpringBoot 公众号集成模板推送消息

    前言 上篇 付项目地址 xff1a https blog csdn net A yonga article details 129398716 spm 61 1001 2014 3001 5501 集成公众号请看之前的文章 本篇说明 基于已
  • Android中native进程内存泄露的调试技巧(一)

    基于Android5 0版本 Android为Java程序提供了方便的内存泄露信息和工具 xff08 如MAT xff09 xff0c 便于查找 但是 xff0c 对于纯粹C C 43 43 编写的natvie进程 xff0c 却不那么容易
  • onNewIntent 什么时候调用

    protected void onNewIntent Intent intent Since API Level 1 This is called for activities that set launchMode to 34 singl
  • [MySQL] MySQL日志系统

    概述 Mysql的日志系统是Mysql保证无论何时崩溃数据都不会丢失的关键 众所周知Mysql是持久化的数据库 所有的数据都是持久化到硬盘中的 保证数据不会丢失 Mysql保证数据不会丢失是从以下两个方面来体现的 能够恢复到任意时刻的数据状
  • IDEA搭建JavaWeb项目,JDBC和Servlet-JSP技术实现注册功能

    文章目录 使用IDEA搭建JavaWeb项目一 IDEA新建JavaWeb项目1 新建java项目2 修改项目配置3 项目部署到Tomcat 二 使用JDBC和Servlet JSP技术实现注册功能1 引入jar包2 搭建项目结构3 后端实
  • JS实现省市区三级联动

    目标 xff1a 用JS实现省市区的三级联动效果 学习内容 xff1a 掌握JS对DOM元素的获取掌握 JS对DOM元素的创建和删除掌握JSON数组的简单解析 实现思路 xff1a 省市区三级联动主要是三个下拉菜单之间的联动效果 xff0c
  • MVC三层架构详解

    文章目录 MVC三层架构详解一 MVC是什么 xff1f 1 什么是低耦合 xff1f 2 低耦合有什么好处 xff1f 3 增加代码复用率4 部署快 xff0c 且生命周期成本低5 可维护性高 二 MVC详解1 MVC经典模式2 MVC设

随机推荐

  • Spring-MVC入门

    文章目录 前言一 Spring MVC是什么 xff1f MVC xff1a MVC的工作流程 xff1a 优势 xff1a 二 使用步骤1 创建Maven项目导入依赖 2 配置前端控制器DispatcherServlet 3 配置后端控制
  • 使用阿里云OSS实现图片上传案例

    文章目录 前言一 OSS是什么 xff1f 二 使用步骤1 开通OSS服务2 创建bucket3 创建子账户4 查看帮助文档 xff0c 编写后端代码5 layui前端 总结 前言 在正式的开发环境中 xff0c 类似图片的静态资源一般不会
  • 使用EasyExcel实现Excel的导入导出

    文章目录 前言一 EasyExcel是什么 xff1f 二 使用步骤1 导入依赖2 编写文件上传配置3 配置表头对应实体类4 监听器编写5 控制层6 前端代码 总结 前言 在真实的开发者场景中 xff0c 经常会使用excel作为数据的载体
  • 使用linux部署项目步骤

    文章目录 前言一 服务器环境配置二 数据库导入三 项目打包1 修改项目中的访问路径2 修改db properties的数据库访问路径3 打包4 修改配置 xff0c 启动服务 四 测试总结 前言 今天学习了在服务器中部署项目 xff0c 记
  • IntelliJ IDEA 2023.1 最新变化 【附带ChatGPT教程】

    ChatGPT开源公众号 xff1a https gitee com wy521a astar weixin mp最新变化 2023 1主要更新用户体验编辑器JavaScala分析器版本控制系统构建工具运行 调试框架和技术DockerKub
  • SpringBoot整合Quartz以及异步调用

    文章目录 前言一 异步方法调用1 导入依赖2 创建异步执行任务线程池3 创建业务层接口和实现类4 创建业务层接口和实现类 二 测试定时任务1 导入依赖2 编写测试类 xff0c 开启扫描定时任务3 测试 三 实现定时发送邮件案例1 邮箱开启
  • SpringCloud详解07-Nacos配置管理

    系列文章目录 文章目录 系列文章目录前言一 nacos配置管理二 使用步骤1 基本配置2 导入Nacos配置 三 配置实时刷新总结 前言 接上篇 xff0c 本篇记录Nacos的配置管理 所有的代码都是基于前篇的基础上 一 nacos配置管
  • 使用SpringBoot+JWT+MybatisPlus实现简单的登陆状态验证

    文章目录 前言一 JWT是什么 xff1f 二 使用步骤1 创建项目 xff0c 导入依赖 xff0c 配置 引入工具类2 编写LoginController和UserController3 编写跨域拦截器和token验证拦截器4 全局拦截
  • 浅谈分布式锁

    文章目录 前言一 分布式锁 xff1f 二 实现思路1 存储一个唯一的键2 使用setnx3 给键设置唯一值4 因为超时导致的并发执行4 Redission5 代码实现 总结 前言 最近学习了分布式锁 xff0c 本篇来记录一下 一 分布式
  • 初识STM32单片机

    目录 一 单片机基本认知 二 STM系列单片机命名规则 三 标准库与HAL库区别 四 通用输入输出端口GPIO 五 推挽输出与开漏输出 六 复位和时钟控制 xff08 RCC xff09 七 时钟控制 八 中断和事件 九 定时器介绍 一 单
  • ubuntu16.04 安装ctags,以及一些使用方法的介绍

    vim对于新手来说太不友好了 xff0c 今天折腾ctags折腾了一天终于是有所收获 xff0c 现在来大概介绍一下 首先ctags顾名思义 xff0c 就算给各种库和 cpp文件打标签 xff0c 得到的标签文件给后面omni compl
  • Lottie 框架Native Heap内存爆炸问题解决

    Lottie框架Native Heap内存爆炸问题解决 Lottie 是在 Android 和 iOS上 原生渲染 的After Effects xff08 AE xff09 动画 Lottie是 Airbnb 开源 的支持Android
  • Kali 美化

    配置完Kali xff0c 作为一个正常人 xff0c 对于默认的Gnome的界面都会感觉到一丝丝不满意 xff0c 毕竟太丑了嘛 那么 xff0c 我们需要对Kali美化一下 首先是桌面切换 xff0c 如果你不喜欢Gnome xff0c
  • 安装Arch(含输入法配置)

    先创建一个虚拟机 xff0c 这是我的虚拟机配置 xff1a 然后查看虚拟机的配置文件 xff0c 编辑Arch vmx文件 xff0c 最后一行添加 firmware 61 34 efi 34 保存退出 xff0c 启动你的虚拟机 不出意
  • 使用ViewPager + FragmentStatePagerAdapter 切换后页面数据加载空白或者丢失

    开头直接上结论 xff01 xff01 xff01 xff01 xff01 xff01 第一种原因 xff1a onCreateView中没有做view持久化 viewpage切换的时候Fragment的生命周期会重新走一遍 xff0c 从
  • DataGrip 2023.1 最新变化 【附带ChatGPT教程】

    ChatGPT开源公众号 xff1a https gitee com wy521a astar weixin mp在浏览器中打开最新变化 DataGrip 2023 1 最新变化 处理代码 DBE 4469 xff1a 我们修正了 SQL
  • awk练习题(一)

    文件中包含名字 xff0c 电话号码和过去三个月里的捐款 用 分隔 具体内容如下 xff1a Mike Harrington 510 548 1278 250 100 175 Christian Dobbins 408 538 2358 1
  • UML类图-基本图示法

    类图 xff1a 分如下三层 类的名称 xff08 如果是抽象类则斜体显示 xff09 类的特性 xff08 字段或属性 xff1a 注意前面的符号 xff1a 43 表示public xff0c 表示private xff0c 表示pro
  • 《Design Patterns》Proxy.积跬步系列

    Proxy xff1a 代理模式 先代码 共用接口 xff1a span class token keyword package span h span class token punctuation span l span class t
  • 《Design Patterns》FactoryMethod.积跬步系列

    FactoryMethod xff1a 工厂方法模式 先代码 父类或接口类 xff1a span class token keyword package span h span class token punctuation span ld