当前位置: 首页 > news >正文

设计模式之工厂方法模式(FactoryMethod)

一、概述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

二、适用性

1.当一个类不知道它所必须创建的对象的类的时候。

2.当一个类希望由它的子类来指定它所创建的对象的时候。

3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

三、参与者

1.Product 定义工厂方法所创建的对象的接口。

2.ConcreteProduct 实现Product接口。

3.Creator 声明工厂方法,该方法返回一个Product类型的对象。 Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。 可以调用工厂方法以创建一个Product对象。

4.ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例。

四、类图

五、示例

Product

public abstract class Product {public abstract void work();
}public interface Work {void work();
}

TeacherWork

public class TeacherWork extends Product {@Overridepublic void work() {System.out.println("老师审批作业!");}
}

 StudentWork

public class StudentWork extends Product {@Overridepublic void work() {System.out.println("学生做作业!");}
}

IWorkFactory

public interface IWorkFactory {/*** 定义获取Product实例对象的方法* @return*/Product getWork();
}

TeacherWorkFactory

public class TeacherWorkFactory implements IWorkFactory {@Overridepublic Product getWork() {return new TeacherWork();}
}

StudentWorkFactory 

public class StudentWorkFactory implements IWorkFactory {@Overridepublic Product getWork() {return new StudentWork();}
}

Test

@Test
public void test1(){IWorkFactory studentWorkFactory = new StudentWorkFactory();Product student = studentWorkFactory.getWork();student.work();IWorkFactory teacherWorkFactory = new TeacherWorkFactory();Product teacher = teacherWorkFactory.getWork();teacher.work();
}

测试结果

Connected to the target VM, address: '127.0.0.1:2702', transport: 'socket'
学生做作业!
老师审批作业!
Disconnected from the target VM, address: '127.0.0.1:2702', transport: 'socket'

六、实践

改造简单工厂模式

增加接口IFxBaseListener 

/*** @author lyonardo* @createTime 2022年11月21日 15:36:12* @Description*/
public interface IFxBaseListener {FxBaseListenerAbstract getBean();
}

实现类

/*** @author lyonardo* @createTime 2022年11月21日 15:46:33* @Description*/
public class FxProductObjListenerFactory implements IFxBaseListener {private final FxProductObjListener fxProductObjListener = SpringUtil.getBean(FxProductObjListener.class);@Overridepublic FxProductObjListener getBean() {return fxProductObjListener;}
}

todo待自测。

http://www.lryc.cn/news/128670.html

相关文章:

  • python的进度条tqdm库,显示时进度条不换行设置
  • spark的使用
  • 力扣:66. 加一(Python3)
  • Go的标准库Context理解
  • Nuxt3_1_路由+页面+组件+资源+样式 使用及实例
  • Kafka第三课
  • elasticsearch修改es集群的索引副本数量
  • 【SpringCloud】Ribbon定制化配置
  • Mac terminal 每次打开都要重新配置文件
  • el-button实现按钮,鼠标移入显示,移出隐藏
  • uniapp+uview封装小程序请求
  • idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵
  • 【论文阅读】基于深度学习的时序预测——LTSF-Linear
  • 02.FFMPEG的安装和添加硬件加速自编译
  • elementUI 的上传组件<el-upload>,自定义上传按钮样式
  • 【卷积神经网络】卷积,池化,全连接
  • 【SA8295P 源码分析】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总
  • 以太网(一):PoE供电
  • 骨传导耳机游泳能戴吗?骨传导游泳耳机哪个牌子好?
  • 18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD
  • 【mysql】MySQL CUP过高如何排查?
  • lua实现http的异步回调
  • 云服务 Ubuntu 20.04 版本 使用 Nginx 配置SSL证书和nginx从HTTP跳转到HTTPS
  • 隧道代理技术解析:为批量数据采集提供强大支持
  • 小程序制作教程:从零开始搭建企业小程序
  • Redis-秒杀
  • 2022年下半年信息安全工程师下午真题及答案解析
  • 【前端|Javascript第5篇】全网最详细的JS的内置对象文章!
  • Python pycparser(c文件解析)模块使用教程
  • 解决IDEA tomcat控制台只有server日志