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

  • Post author:
  • Post category:java


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


源码地址: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案例



版权声明:本文为qq_36893229原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。