靜態工廠java
首先,要有一個靜態工廠來生成對象,編寫一個Car類和一個StaticCarFactory類:spring
package cn.net.bysoft.lesson5; public class Car { public Car() { } public Car(String name) { this.name = name; } @Override public String toString() { return "Car [name=" + name + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } private String name; }
package cn.net.bysoft.lesson5; import java.util.HashMap; import java.util.Map; public class StaticCarFactory { private static Map<String, Car> cars = new HashMap<String, Car>(); static { cars.put("Audi", new Car("Audi")); cars.put("Ford", new Car("Ford")); } public static Car getCar(String name) { return cars.get(name); } }
在spring的配置文件進行配置,讓spring幫咱們調用靜態工廠方法生成Car對象:less
<bean id="car1" class="cn.net.bysoft.lesson5.StaticCarFactory" factory-method="getCar"> <constructor-arg value="Audi"></constructor-arg> </bean>
能夠看到class不在是Car的全類名,而是靜態工廠的全類名,factory-method屬性指向的是工廠中生成Car的方法名稱,而這個方法有一個name參數,咱們經過constructor-arg元素進行傳參,傳送給靜態工廠方法一個Audi參數,要求工廠返回一個Car,名字是Audi,測試一下:ide
@Test public void testStaticFactory() { Car car1 = (Car) ctx.getBean("car1"); System.out.println(car1); /** * output:Car [name=Audi] * */ }
實例工廠測試
其實與靜態工廠的用法相似,建立一個實例工廠:this
package cn.net.bysoft.lesson5; import java.util.HashMap; import java.util.Map; public class InstanceCarFactory { private Map<String, Car> cars = new HashMap<String, Car>(); public InstanceCarFactory() { cars.put("Audi", new Car("Audi")); cars.put("Ford", new Car("Ford")); } public Car getCar(String name) { return cars.get(name); } }
修改一個配置文件:spa
<bean id="carFactory" class="cn.net.bysoft.lesson5.InstanceCarFactory"></bean> <bean id="car2" factory-bean="carFactory" factory-method="getCar"> <constructor-arg value="Ford"></constructor-arg> </bean>
首先,在配置文件中定義一個實例工廠的bean,接着,Car對象的bean不須要指定class了,而是使用factory-bean屬性將實例工廠bean的id賦值到該屬性,在定義factory-method,也就是生成對象的方法名稱,給方法傳值與以前的靜態工廠同樣。要求工廠生成一個Ford汽車,測試一下結果:.net
@Test public void testInstanceFactory() { Car car2 = (Car) ctx.getBean("car2"); System.out.println(car2); /** * output:Car [name=Ford] * */ }
內置的FactoryBeancode
Spring爲咱們提供了一個FactoryBean接口,咱們能夠自定義工廠去實現這個接口:xml
package cn.net.bysoft.lesson5; import org.springframework.beans.factory.FactoryBean; public class CarFactoryBean implements FactoryBean<Car> { private String brand; public void setBrand(String brand) { this.brand = brand; } @Override public Car getObject() throws Exception { // TODO Auto-generated method stub return new Car(brand); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Car.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
這個接口只有三個方法:getObject、getObjectType和isSingleton,分別用來得到一個對象、得到這個對象的類型和這個對象是不是單例的。
經過配置spring的配置文件,就能夠使用這個工廠:
<bean id="car3" class="cn.net.bysoft.lesson5.CarFactoryBean"> <property name="brand" value="BMW"></property> </bean>
將要生成的對象的class指定FactoryBean的全類名,設置屬性,Spring會自動調用getObject()方法返回對象。
@Test public void testFactoryBean() { Car car3 = (Car) ctx.getBean("car3"); System.out.println(car3); /** * output:Car [name=BMW] * */ }