Spring的实例工厂方法和静态工厂方法


静态工厂方法:直接调用静态方法可以返回Bean的实例




1. package com.zhu.string.factory;  
2.   
3. import java.util.HashMap;  
4. import java.util.Map;  
5.   
6. public class StaticCarFactory {  
7. /**
8.      * 静态工厂方法:直接调用静态方法可以返回Bean的实例
9.      *
10.      */  
11. private static Map<String ,Car >  cars=new HashMap<String , Car>();  
12. static{  
13. "audi",    new Car(3000, "aodi"));  
14. "fodo",    new Car(3000, "aodi"));  
15.     }  
16. //静态工厂方法  
17. public static Car getCar(String name){        
18. return cars.get(name);  
19.     }  
20. }




实例工厂方法。即调用工厂本身,再调用工厂的实例方法来返回bean实例




1. package com.zhu.string.factory;  
2.   
3. import java.util.HashMap;  
4. import java.util.Map;  
5.   
6. public class InstanceCarFactory {  
7. /**
8.      * 实例工厂方法。即调用工厂本身,再调用工厂的实例方法来返回bean实例
9.      */  
10. private Map<String ,Car> cars=null;  
11. public InstanceCarFactory() {  
12. // TODO Auto-generated constructor stub  
13. new HashMap<String, Car>();  
14. "audi", new Car(1000,"audi"));  
15. "dffdas", new Car(2000,"audi"));  
16.     }  
17. public Car getCar(String brand){  
18. return cars.get(brand);  
19.     }  
20. }


beans-factory.xml




1. <span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>  
2. <beans xmlns="http://www.springframework.org/schema/beans"  
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
4.   
5. xmlns:p="http://www.springframework.org/schema/p"  
6. xsi:schemaLocation="http://www.springframework.org/schema/beans   
7.   
8. http://www.springframework.org/schema/beans/spring-beans.xsd">  
9.   
10. <!-- 通过静态方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 
11. 
12. -->  
13.     <!--  
14.         class属性:指向静态方法的全类名 factory-method:指向静态方法的名字  
15.         constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配  
16.   
17. 置参数  
18. >  
19. <bean id="car1" factory-method="getCar"  
20. class="com.zhu.string.factory.StaticCarFactory">  
21. <constructor-arg value="audi"></constructor-arg>  
22. </bean>  
23. <!-- 配置工厂的实例 -->  
24. <bean id="carFactory" class="com.zhu.string.factory.InstanceCarFactory">  
25. </bean>  
26. <bean id="car2" factory-bean="carFactory" factory-method="getCar">  
27. <constructor-arg value="audi"></constructor-arg>  
28. </bean>  
29. </beans></span>


Car.java实体类





    1. package com.zhu.string.factory;  
    2.   
    3. public class Car {  
    4. private double price;  
    5. private String brand;  
    6. public double getPrice() {  
    7. return price;  
    8.     }  
    9. public void setPrice(double price) {  
    10. this.price = price;  
    11.     }  
    12. public String getBrand() {  
    13. return brand;  
    14.     }  
    15. public void setBrand(String brand) {  
    16. this.brand = brand;  
    17.     }  
    18. @Override  
    19. public String toString() {  
    20. return "Car [brand=" + brand + ", price=" + price + "]";  
    21.     }  
    22. public Car(){  
    23. "cars....constructor");  
    24.     }  
    25. public Car(double price, String brand) {  
    26. super();  
    27. this.price = price;  
    28. this.brand = brand;  
    29.     }  
    30.       
    31. }


    Main.java





      1. package com.zhu.string.factory;  
      2.   
      3. import org.springframework.context.ApplicationContext;  
      4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
      5.   
      6. public class Main {  
      7.   
      8. /**
      9.      * @param args
      10.      */  
      11. public static void main(String[] args) {  
      12. // TODO Auto-generated method stub  
      13. new ClassPathXmlApplicationContext("beans-  
      14.   
      15. factory.xml");  
      16. "car1");  
      17.         System.out.println(car1);  
      18.           
      19. "car2");  
      20.         System.out.println(car2);  
      21.     }  
      22.   
      23. }



      运行结果:



      Car [brand=aodi, price=3000.0]
      Car [brand=audi, price=1000.0]