请说明一下IOC的静态工厂方法和实例工厂方法的区别?
-
静态工厂方法:工厂初始化之前,工厂中的类已经被实例化放在工厂容器中
-
实例工厂方法:工厂在构造方法初始化时,会将类进行实例化放在工厂中
创建实例类:
1 public class Car {
2 private double price;
3 private String brand;
4
5 public Car() {
6 System.out.println("cars...constractor");
7 }
8
9 public Car(double price, String brand) {
10 super();
11 this.price = price;
12 this.brand = brand;
13 }
14
15 public double getPrice() {
16 return price;
17 }
18
19 public void setPrice(double price) {
20 this.price = price;
21 }
22
23 public String getBrand() {
24 return brand;
25 }
26
27 public void setBrand(String brand) {
28 this.brand = brand;
29 }
30
31 @Override
32 public String toString() {
33 return "Car{" +
34 "price=" + price +
35 ", brand='" + brand + '\'' +
36 '}';
37 }
38 }
创建实例工厂方法:即调用工厂本身,再调用工厂的实例方法来返回bean实例
1 public class InstanceCarFactory {
2 /**
3 * 实例工厂方法
4 */
5 private Map<String,Car> cars = null;
6 public InstanceCarFactory(){
7 cars = new HashMap<String, Car>();
8 cars.put("audi",new Car(3000,"audi"));
9 cars.put("dffds" , new Car(3000,"audi"));
10 }
11 public Car getCar(String name){
12 return cars.get(name);
13 }
14 }
创建静态工厂方法:直接调用静态方法可以返回Bean的实例
1 public class StaticCarFactory {
2 /**
3 * 静态工厂方法:直接调用静态方法可以返回bean的实例
4 */
5 private static Map<String,Car> cars = new HashMap<String, Car>();
6 static {
7 cars.put("audi" , new Car(3000,"aodi"));
8 cars.put("fodo",new Car(3000,"aodi"));
9 }
10 //静态工厂方法
11 public static Car getCar(String name){
12 return cars.get(name);
13 }
14
15 }
配置文件:
<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 通过静态方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例-->
<!--class属性:指向静态方法的全类名 factory-method:指向静态方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数-->
<bean id="car1" factory-method="getCar" class="com.zhu.string.factory.StaticCarFactory">
<constructor-arg value="audi"></constructor-arg>
</bean>
<!-- 配置工厂的实例 -->
<bean id="carFactory" class="com.zhu.string.factory.InstanceCarFactory">
</bean>
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
</beans>
</span>