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