1工厂模式
1.1使用工厂模式的原因
抽象类的对象/复杂的接口不能直接交给spring管理,所以需要工厂模式来管理抽象类和接口
举例:用抽象类Calendar抽象类进行工厂模式的测试
Calendar类 :格林威治时间,是一个抽象类。不可以交给spring容器管理
2静态工厂模式
引入:静态方法
特点:1.静态方法调用可以直接通过类名直接调用
2.静态属性内存中独一份
利用静态属性的特性创建工厂,不可缺少关键字static
package com.jt.factory;
import java.util.Calendar;
public class StaticFactory {
public static Calendar getCalendar(){
return Calendar.getInstance();
}
}
配置文件
<!-- 静态工厂模式的写法-->
<bean id="Calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"></bean>
测试类
package com.jt;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Calendar;
public class TestSpring {
@Test
public void teststatic(){
ApplicationContext context=new ClassPathXmlApplicationContext("application.xml");
Calendar calendar1 = (Calendar) context.getBean("Calendar1");
System.out.println("获取当前时间"+calendar1);
}
}
结果
3.实例化工厂模式
与静态工厂模式区别:具体变化体现在配置文件和创建对象的过程
对象
package com.jt.factory;
import java.util.Calendar;
public class InstanceFactory {
public Calendar getCalendar(){
return Calendar.getInstance();
}
}
配置文件
<!-- 实例化工厂模式-->
<bean id="instancefactory" class="com.jt.factory.InstanceFactory"></bean>
<bean id="calendar2" factory-bean="instancefactory" factory-method="getCalendar" ></bean>
测试代码及运行结果
4.spring工厂模式
直接利用FactoryBean接口,简单高效
代码
package com.jt.factory;
import org.springframework.beans.factory.FactoryBean;
import java.util.Calendar;
public class SpringFactory implements FactoryBean{
//获取对象
@Override
public Calendar getObject() throws Exception {
return Calendar.getInstance();
}
//获取类型
@Override
public Class<Calendar> getObjectType() {
return Calendar.class;
}
//单例对象
@Override
public boolean isSingleton() {
return true;
}
}
配置文件
<!-- spring工厂模式-->
<bean id="calendar3" class="com.jt.factory.SpringFactory"></bean>
4.1原因:
钩子函数
系统的运行流程