Spring ---- 静态工厂方法、实例工厂方法创建 Bean

本文转载自:https://www.cnblogs.com/goodcheap/p/6492393.html

https://blog.csdn.net/woshiwusonghaha/article/details/51051802


------------------------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------------------

二者的主要区别是:

1.实例化时,静态工厂中实例化是在static中,而实例工厂中是在工厂类的构造函数中;

2.调用方法中,静态工厂中函数有static说明,实例工厂中没有;

3.bean配置时,静态工厂只需要bean 一个car类就可以,但是实例工厂需要先bean工厂,在bean 一个具体的类car。

------------------------------------------------------------------------------------------------------------------

详解:

1.通过调用静态工厂方法创建 bean:

  • 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节。
  • 要声明通过静态方法创建的 bean ,
  • 需要在 bean 的 class 属性里面指定拥有该工厂的方法的类 ,
  • 在 factory-method 属性里指定工厂方法的名称。
  • 使用 <constructor-arg> 元素为该方法传递方法参数。
复制代码
 1 <?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        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6     <bean id="car" class="com.itdoc.spring.factory.StaticFactory"
 7           factory-method="getCar">
 8         <constructor-arg value="Maserati"/>
 9     </bean>
10 
11 </beans>
复制代码
复制代码
 1 package com.itdoc.spring.factory;
 2 
 3 /**
 4  * http://www.cnblogs.com/goodcheap
 5  *
 6  * @author: Wáng Chéng Dá
 7  * @create: 2017-03-02 19:30
 8  */
 9 public class Car {
10 
11     private String brand;
12 
13     private double price;
14 
15     public String getBrand() {
16         return brand;
17     }
18 
19     public void setBrand(String brand) {
20         this.brand = brand;
21     }
22 
23     public double getPrice() {
24         return price;
25     }
26 
27     public void setPrice(double price) {
28         this.price = price;
29     }
30 
31     public Car(String brand, double price) {
32         this.brand = brand;
33         this.price = price;
34     }
35 
36     public Car() {
37     }
38 
39     @Override
40     public String toString() {
41         return "Car{" +
42                 "brand='" + brand + '\'' +
43                 ", price=" + price +
44                 '}';
45     }
46 }
复制代码
复制代码
 1 package com.itdoc.spring.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 静态工厂方法
 8  * http://www.cnblogs.com/goodcheap
 9  *
10  * @author: Wáng Chéng Dá
11  * @create: 2017-03-02 19:27
12  */
13 public class StaticFactory {
14 
15     public static Map<String, Car> cars = new HashMap<String, Car>();
16 
17     static {
18         cars.put("Ferrari", new Car("Ferrari", 25000000));
19         cars.put("Maserati", new Car("Maserati", 2870000));
20     }
21 
22     public static Car getCar(String name) {
23         return cars.get(name);
24     }
25     
26 }
复制代码
复制代码
 1 package com.itdoc.spring.factory;
 2 
 3 import org.springframework.beans.factory.FactoryBean;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 
 7 /**
 8  * http://www.cnblogs.com/goodcheap
 9  *
10  * @author: Wáng Chéng Dá
11  * @create: 2017-03-02 19:41
12  */
13 public class Main {
14 
15     public static void main(String[] args) {
16 
17         ApplicationContext ctx = new ClassPathXmlApplicationContext("factory-beans.xml");
18         Car car = (Car) ctx.getBean("car");
19         System.out.println(car);
20 
21     }
22 }
复制代码

 

控制台输出:

Car{brand='Maserati', price=2870000.0}

 

------------------------------------------------------------------------------------------------------------------


2.通过调用实例工厂方法创建 bean:

  • 实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时 , 只需要简单的调用该实例方法而不需要关心对象的创建细节。
  • 要声明通过实例工厂方法创建的 bean
  • 声明工厂类bean
  • 在 bean 的factory-bean 属性里指定拥有该工厂方法的bean。
  • 在 factory-method 属性里指定该工厂方法的名称。
  • 使用 <constructor-arg> 元素为工厂方法传递方法参数。
复制代码
 1 <?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        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6     <bean id="carFactory" class="com.itdoc.spring.factory.InstanceFactory"></bean>
 7 
 8     <bean id="car2" factory-bean="carFactory" factory-method="getCar">
 9         <constructor-arg value="Ferrari"/>
10     </bean>
11 
12 </beans>
复制代码
复制代码
 1 package com.itdoc.spring.factory;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 实例工厂方法
 8  * http://www.cnblogs.com/goodcheap
 9  *
10  * @author: Wáng Chéng Dá
11  * @create: 2017-03-02 20:02
12  */
13 public class InstanceFactory {
14 
15     private Map<String, Car> cars = null;
16 
17     public InstanceFactory() {
18         cars = new HashMap<String, Car>();
19         cars.put("Ferrari", new Car("Ferrari", 25000000));
20         cars.put("Maserati", new Car("Maserati", 2870000));
21     }
22 
23     public Car getCar(String name) {
24         return cars.get(name);
25     }
26 }
复制代码
复制代码
 1 package com.itdoc.spring.factory;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 /**
 7  * http://www.cnblogs.com/goodcheap
 8  *
 9  * @author: Wáng Chéng Dá
10  * @create: 2017-03-02 19:41
11  */
12 public class Main {
13 
14     public static void main(String[] args) {
15 
16         ApplicationContext ctx = new ClassPathXmlApplicationContext("factory-beans.xml");
17        
18         car = (Car) ctx.getBean("car2");
19         System.out.println(car);
20 
21     }
22 }
复制代码

 

控制台输出:

Car{brand='Ferrari', price=2.5E7}

猜你喜欢

转载自blog.csdn.net/qq_36098284/article/details/80606738
今日推荐