1、什么是工厂方法
这里的工厂方法指的是创建指定bean的方法。工厂方法又分为静态工厂方法和实例工厂方法。
2、静态工厂方法配置bean
调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,不需要创建工厂实例就可以返回工厂创建的对象,就叫做静态工厂,当客户端需要对象时,只需要简单的调用静态方法,而不需要关心创建对象的细节。
首先创建一个提供静态工厂方法的类:
1 public class StaticCarFactory { 2 private static Map<String, Car> cars = new HashMap<String, Car>(); 3 static { 4 cars.put("audi", new Car("audi", 300000)); 5 cars.put("ford", new Car("audi", 400000)); 6 } 7 //静态工厂方法,根据名字获取car对象 8 public static Car getCar(String name) { 9 return cars.get(name); 10 } 11 }
spring配置文件
1 <!--通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例--> 2 <!-- 3 class属性:指向静态工厂的全类名 4 fatory-method:指向静态工厂方法的名字 5 constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数 6 --> 7 <bean id="car1" class="com.wzy.factory.StaticCarFactory" factory-method="getCar"> 8 <constructor-arg name="name" value="audi"/> 9 </bean>
编写Main测试类
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml"); 4 5 Car car1 = (Car) ctx.getBean("car1"); 6 7 System.out.println(car1); 8 } 9 }
输出结果:我们可以看到通过静态工厂成功创建了一个对象。
3、实例工厂方法配置bean
使用实例工厂方法配置bean首先需要创建一个实例工厂的bean,通过调用实例工厂bean的非静态方法创建目标的bean对象,同时在factory-bean属性里指定工厂bean的id,最后使用<constrctor-arg>元素为该方法传递方法参数。
首先创建一个实例工厂的bean:
1 public class InstanceCarFactory { 2 private Map<String, Car> cars = null; 3 4 public InstanceCarFactory() { 5 cars = new HashMap<String, Car>(); 6 cars.put("audi", new Car("audi", 300000)); 7 cars.put("ford", new Car("ford", 400000)); 8 } 9 10 public Car getCar(String name){ 11 return cars.get(name); 12 } 13 14 }
配置Spring配置文件
1 <!--实例工厂的实例--> 2 <!-- 3 factory-bean:指向实例工厂方法的bean 4 fatory-method:指向实例工厂方法的名字 5 constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数 6 --> 7 <bean id="instanceCarFactory" class="com.wzy.factory.InstanceCarFactory"/> 8 <!--通过实例工厂来配置bean--> 9 <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar"> 10 <constructor-arg name="name" value="ford"/> 11 </bean>
修改Main测试类:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml"); 4 5 Car car2 = (Car) ctx.getBean("car2"); 6 7 System.out.println(car2); 8 } 9 }
输出结果: