[轉]Spring中工廠模式簡介
工廠模式作用:
核心思想:實例化對象
需求:
1.多例對象的創建
2.有些對象 例如接口/抽象類不能直接實例化 接口–代理 抽象類–創建子類
3.需要對對象進行二次封裝
靜態工廠:
說明: 靜態工廠必須有靜態方法。
調用方式:類名.靜態方法
例:
(1)建立工廠類
package com.jt.manage.factory; import java.util.Calendar; public class StaticFactory { public static Calendar getInstance(){ return Calendar.getInstance(); } }
(2)交給Spring管理
配置xml文件
<!--配置靜態工廠 -->
<bean id="calendarA" class="com.jt.manage.factory.StaticFactory" factory-method="getInstance" />
靜態工廠可以通過類名.靜態方法的形式獲取對象,因此只需要將靜態工廠對象交給Spring管理,并提供靜態工廠方法即可。
實例工廠:
說明:實例化工廠要求必須先創建工廠對象,之后通過工廠方法調用獲取對象
(1)建立工廠類
package com.jt.manage.factory; import java.util.Calendar; public class InstanceFactory { public Calendar getInstance(){ return Calendar.getInstance(); } }
(2)交給Spring管理
配置xml文件
<!--配置實例化工廠 --> <bean id="instanceFactory" class="com.jt.manage.factory.InstanceFactory"></bean> <bean id="calendarB" class="com.jt.manage.factory.InstanceFactory" factory-bean="instanceFactory" factory-method="getInstance"></bean>
實例工廠需要將工廠對象交給Spring管理,然后建立bean對象,將工廠對象和工廠對象的獲取對象方法交給其即可。
Spring工廠:
說明:該模式有spring內部調用,不需要做多余的配置但是需要實現特定的接口FactoryBean。
(1)建立工廠類
public class CalendarFactory implements FactoryBean<Calendar> { @Override public Calendar getObject() throws Exception { // TODO Auto-generated method stub return Calendar.getInstance(); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Calendar.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; }
(2)交給Spring管理
<!--配置spring工廠 --> <bean id="calendarC" class="com.jt.manage.factory.CalendarFactory"></bean>
FactoryBean接口需要實現三個方法并制定工廠管理的對象泛型。
isSingleton()方法:用于指定對象是否為單例,單例對象由Spring創建、存儲并管理;多例對象Spring只負責創建,不負責銷毀。
getObjectType() 方法:若對象為單例,則在Spring容器關閉時調用此方法,獲得該對象的class對象并通過class對象尋找所有該類對象進行刪除。
getObject()方法:獲取對象。
工具類測試:
@Test public void testFactory(){ //1.實例化Spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("spring/factory.xml"); Calendar calendarA = (Calendar) context.getBean("calendarA"); System.out.println(calendarA.getTime()); Calendar calendarB = (Calendar) context.getBean("calendarB"); System.out.println(calendarB.getTime()); Calendar calendarC = (Calendar) context.getBean("calendarB"); System.out.println(calendarC.getTime()); }

浙公網安備 33010602011771號