通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

源码地址:https://gitee.com/yang-kairui/design-pattern

通过简单模拟spring的IoC容器来尝试工厂模式的使用:

先请出主角ObjectFactory,他只有一个方法getObject(),用来生产对象

@FunctionalInterface
public interface ObjectFactory<T> {/*** 返回由该工厂管理的对象的一个实例(可能是共享的或独立的)。* @return 对象的一个实例*/T getObject() throws Exception;}

再写一个接口BeanFactory用来封装管理bean对象的方法,我只模拟两个方法,一个用来获取bean,一个用来获取bean的工厂

public interface BeanFactory {/*** 通过名称获取bean* @param name bean的名称* @param requiredType bean的字节对象* @param <T> bean的类型* @return*/<T>T getBean(String name,Class<T> requiredType) throws Exception;/*** 获取生成bean的工厂** @param <T> bean的类型* @return bean生产工厂*/<T>ObjectFactory<T> getObjectFactory(Class<T> requiredType);
}

最后实现spring的ioc容器

public class ApplicationContext implements BeanFactory {private final HashMap<String, Object> context = new HashMap<>();@Override@SuppressWarnings("unchecked")public <T> T getBean(String name, Class<T> requiredType) throws Exception {synchronized (this.context) {Object bean = this.context.get(name);if (null != bean) {return (T) bean;}bean = getObjectFactory(requiredType).getObject();this.context.put(name, bean);return (T) bean;}}@Overridepublic <T> ObjectFactory<T> getObjectFactory(Class<T> requiredType) {return requiredType::newInstance;}
}

创建一个map,作为容器保存我们的bean对象,当我们通过name去获取bean,如果容器中存在则直接返回,如果容器中不存在,则通过我们的工厂去生产bean,然后存储在容器中,值得一提的事,工厂中生产bean的方法可以随意实现,这里采用了反射去生产,这也是工厂模式的作用。
23种设计模式JAVA案例

JAVA工厂模式(手写Spring IOC案例)相关推荐

  1. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  2. 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码

    估计很多朋友使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 你是不是有这样的感觉呢? 但是 spring 源码存在一个问题,那就是过于抽象,导致 ...

  3. 手写 Spring 事务、IOC、DI 和 MVC

    Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...

  4. 手写Spring DI依赖注入,嘿,你的益达!

    手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...

  5. JAVA项目代码手写吗_一个老程序员是如何手写Spring MVC的

    见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十多 ...

  6. 十年java架构师分享:我是这样手写Spring的

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

  7. 30个类仿真手写spring框架V2.0版本

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  8. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  9. 05. 手写Spring核心框架

    目录 05 手写Spring核心框架 Pt1 手写IoC/DI Pt1.1 流程设计 Pt1.2 基础配置 application.properties pom.xml web.xml Pt1.3 注 ...

最新文章

  1. jenkins访问页面是那个html,Jenkins自动化代码上线-静态网页篇
  2. 使用 Stream API 高逼格 优化 Java 代码!
  3. opencv实现图片HDR功能
  4. shell脚本执行php文件_分享两个shell脚本实例--批量生成随机字符文件名和批量改名...
  5. LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列
  6. __attribute__编绎属性、关于__init、__initdata、__exit、__exitdata及类似的宏、关于initcall的一些宏定义、__setup宏的来源及使用...
  7. 【AD】如何将喜欢的图案导出成为丝印层和PCB形状
  8. leetcode题解3-无重复字符的最长子串
  9. eclipse导入源码
  10. c语言10000以内最大的质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  11. Publish over FTP发布报错
  12. 平滑滤波器模板尺寸与平滑效果的关系_冲压模具丨折弯尺寸、毛刺、、卯合、滑块不顺的根源...
  13. Nitrux安装JDK-10(Linux通用)教程
  14. 关于private继承
  15. 春赏百花秋望月,夏沐凉风冬听雪
  16. 如何对待每逢佳节被逼婚
  17. 操作系统管理计算机资源
  18. autojs网络验证,权朗网络验证源码
  19. 【ADS学习笔记(一)——ADS介绍】
  20. HDU - 1173 采矿

热门文章

  1. 用python解决百马百担问题_利用C语言实现“百马百担”问题方法示例
  2. android 滚轮刻度尺的实现
  3. 苹果x重启方法_iPhone12关机的三种方法,哪种最简单?
  4. idea字体设置--主题下载推荐及使用
  5. idea 注解制表符_如何在IntelliJ IDEA中使用制表符进行缩进?
  6. blender3.2 ShaderToRgb 节点修改 导致一些次表面材质 透光失效 解决
  7. 我爱瞎逛,我爱煮饭。
  8. 【word文档使用方法记录】论文格式修改
  9. 【C++进阶】智能指针(万字详解)
  10. python编程从入门到实践 练习7-8:熟食店