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

源码地址: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. 从前端框架到前端架构参考资料
  2. C语言一个双向链表的实现
  3. boost::mpi模块实现测试mpi版本
  4. C语言多项式乘法模拟,急!!!!c语言:求n次多项式的加法和乘法
  5. DNS解析原理与Bind部署DNS服务
  6. 药房管理(信息学奥赛一本通-T1075)
  7. 【java】java boolean 源码分析
  8. mysql是否需要设置外键_数据库到底需不需要设置外键?
  9. Ubuntu18.04解决sudo执行慢的问题
  10. mysql从库追主库日志_centos 6.5设置mysql主从同步过程记录
  11. php mysql 跨库_PHP使用PDO进行跨数据库操作
  12. SCI科技论文写作成长营(完整版)
  13. jeecg框架中时间控件时分秒的显示
  14. 如何删除桌面右键菜单中的英特尔核心显卡选项
  15. c语言的虚拟变量,含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解...
  16. python基础知识
  17. 金庸感人的经典爱情对白
  18. 腾讯企业 html邮件模板,腾讯企业邮箱DMARC设置指南(TXT记录)
  19. 穹顶灯打不出阴暗面_微服务的阴暗面,解释
  20. 7-148 亲和数判断

热门文章

  1. css3设置动画不循环播放,不一样的css3之Animation
  2. C#WIN10系统下使用Convert.ToDateTime转换EXCEL日期报错
  3. perl 正则表达式使用技巧
  4. 成功的10个必要条件
  5. WEB代码:jiuxian特效-优惠推荐-Jquery动画
  6. 最近的工作心得与反思
  7. 不可不知的全面产品分析
  8. 3DsMax—投影效果制作
  9. pyqt5 python 定时器的实现
  10. 关于python UI Selenium自动化的一个浏览器driver重复调用问题