Spring中工廠模式簡介
阿新 • • 發佈:2018-12-18
工廠模式作用: 核心思想:例項化物件 需求: 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工廠:
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());
}