JAVA工厂模式(手写Spring IOC案例)

本文通过Java代码展示了如何使用工厂模式实现一个简单的Spring IoC容器模拟。ObjectFactory接口定义了创建对象的规范,BeanFactory接口封装了获取bean和bean工厂的方法,ApplicationContext实现了BeanFactory,提供获取bean和创建bean工厂的功能。通过这个例子,我们了解了工厂模式在创建对象中的应用以及其在IoC容器中的作用。
摘要由CSDN通过智能技术生成

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

源码地址: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;
      }
   }

   @Override
   public <T> ObjectFactory<T> getObjectFactory(Class<T> requiredType) {
      return requiredType::newInstance;
   }
}

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值