Spring工厂方法

Spring工厂方法

IoC通过工厂模式创建bean有两种方式:

1、静态工厂方法

2、实例工厂方法

区别:静态工厂类不需要实例化,实例工厂类需要实例化

静态工厂类加工Car对象是用的类方法static方法,不需要创建工厂对象;实例工厂类加工Car对象使用的是工厂对象的构造方法,需要创建工厂对象


(1)、静态工厂方法

1、创建Car类

在这里插入图片描述

2、创建静态工厂类、静态工厂方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、xml

不能这么写,这样就是普通的车,不是被工厂加工了的车。而且报错,因为有参构造会把无参构造覆盖掉
在这里插入图片描述
在这里插入图片描述
正确方法:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 静态工厂方法,不创建工厂对象,直接调方法即可 -->
    <bean id="car1" class="com.lmh.factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="1"></constructor-arg>
    </bean>   
   
    <bean id="car2" class="com.lmh.factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="2"></constructor-arg>
    </bean>    
</beans>

在这里插入图片描述

factory-method 指向静态方法。

constructor-arg 的value属性是调用静态方法传入的参数。

在这里插入图片描述在这里插入图片描述


(2)、实例工厂方法

1、创建实例工厂类、工厂方法

2、Spring.xml

    <!-- 实例工厂-->

    <!-- 实例工厂类的对象-->
    <bean id="instanceCarFactory" class="com.lmh.factory.InstanceCarFactory">
    </bean>

<!--Car对象,通过调用实例工厂 对象(factory-bean) 的getCar方法 获取 -->
    <bean id="car_1" factory-bean="instanceCarFactory" factory-method="getCar">
        <constructor-arg value="1"></constructor-arg>
    </bean>

    <bean id="car_2" factory-bean="instanceCarFactory" factory-method="getCar">
        <constructor-arg value="2"></constructor-arg>
    </bean>

3、测试一下

      //实例化工厂类
        InstanceCarFactory instanceCarFactory = new InstanceCarFactory();
        Car car = instanceCarFactory.getCar(1);
        System.out.println(car);

        //IoC实例化工厂方法
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_factory.xml");
        Car car1 = (Car) applicationContext.getBean("car_1");
        Car car2 =  (Car)applicationContext.getBean("car_2");
        System.out.println(car1);
        System.out.println(car2);

在这里插入图片描述

在这里插入图片描述

(3)、区别

区别:静态工厂方法 加工Car对象是用的类方法static方法,不需要创建工厂对象;实例工厂方法 加工Car对象使用的是工厂对象的构造方法,需要创建工厂对象

静态工厂方法在Spring.xml中只需配置一个bean,即最终的结果Car即可。

而实例工厂方法在Spring.xml中需要配置两个bean。 一个是工厂的bean,再根据工厂的bean得到Car的bean(对象)。因为getCar()方法是非static的,需要用对象调用。

spring.xml 中 class + factory-method的形式是直接调用类中的工厂方法。

– 静态工厂

<bean id="car1" class="com.lmh.factory.StaticCarFactory" factory-method="getCar"></bean>

spring.xml中factory-bean + factory-method的形式则是调用工厂bean 中的工厂方法,就必须先创建工厂bean,再得到Car的Bean。

– 实例工厂

 <bean id="car_1" factory-bean="instanceCarFactory" factory-method="getCar">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值