通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
    
     源码地址: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 版权协议,转载请附上原文出处链接和本声明。
