1. 程式人生 > >Spring中工廠模式簡介

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());
	}