在spring中使用工厂模式

bean的创建默认就是框架利用反射new出来的bean实例
工厂模式:工厂帮我们创建bean;有一个专门帮我们创建对象的类,这个类就是工厂
假设有一个飞机类Airplane,那么工厂模式中飞机的创建方法就是
Airplane ap = AirplaneFactory.getAirplane(String jzName);

静态工厂:工厂本身不用创建对象;通过静态方法调用 对象 = 工厂类.工厂方法名();
实例工厂:工厂本身需要创建对象:工厂类 工厂对象 = new 工厂类();
工厂对象.getAirplane(String jzName);

1.创建静态工厂
首先实现静态工厂类AirplaneStaticFactory,在这里面实现getAirplane方法(方法中代码乱写的hhh)

public class AirplaneStaticFactory {
    public static Airplane getAirplane(String jzName){
        System.out.println("AirplaneStaticFactory");
        Airplane airplane = new Airplane();
        airplane.setFdj("www");
        airplane.setFjsName("wwww");
        airplane.setPersonNum(300);
        airplane.setJzName(jzName);
        airplane.setYc("333");
        return airplane;
    }
}

那么在bean中配置工厂就是:

 <!-- 静态工厂 factory-method:指定哪个方法为工厂方法
    class:指定工厂名
    constructor-arg:给工厂方法传参
    -->
    <bean id="airplane01" class="com.lzt.factory.AirplaneStaticFactory"
          factory-method="getAirplane">
        <!-- 可以为方法指定参数 -->
        <constructor-arg value="lisi"/>
    </bean>

在代码中获取airplane对象就是,直接获取工厂id即可

Airplane airplane = (Airplane) ioc3.getBean("airplane01");

2.创建实例工厂
首先实现实例工厂类AirplaneInstanceFactory(其实就是去掉了static)

public class AirplaneInstanceFactory {
    public Airplane getAirplane(String jzName){
        System.out.println("AirplaneInstanceFactory");
        Airplane airplane = new Airplane();
        airplane.setFdj("www");
        airplane.setFjsName("wwww");
        airplane.setPersonNum(300);
        airplane.setJzName(jzName);
        airplane.setYc("333");
        return airplane;
    }
}

那么在bean中配置工厂就是:

<!-- 2.实例工厂 factory-method:指定哪个方法为工厂方法-->
    <bean id="airplaneInstanceFactory" class="com.lzt.factory.AirplaneInstanceFactory">
    </bean>

在使用实例工厂创建对象的时候,依然要在容器中注册对象组件,然后再注册的使用配置我们的对象要使用哪个工厂创建
1)factory-bean:指定使用哪个工厂实例
2)factory-method:指定使用哪个工厂方法

    <!-- 实例工厂 factory-bean:指定对象使用哪个工厂
        1.先配置出实例工厂对象
        2.配置我们的airplane对象要使用哪个工厂创建
            1)factory-bean:指定使用哪个工厂实例
            2)factory-method:指定使用哪个工厂方法
    -->
    <bean class="com.lzt.bean.Airplane" id="airplane02"
          factory-bean="airplaneInstanceFactory" factory-method="getAirplane">
        <constructor-arg value="wangwu"></constructor-arg>
    </bean>

3.使用FactoryBean类
首先实现实例工厂类BookFactoryImple,继承了FactoryBean<>,要实现其中对应的方法。
实现了FactoryBean的类是spring认为的工厂类
FactoryBean 泛型是指定你要创建什么样的对象

在Spring中使用工厂
1.先编写FactoryBean的实现类
2.在spring配置文件中进行注册

public class BookFactoryImple implements FactoryBean<Book> {


    /*
     getObject:工厂方法;
     返回创建的对象
     */
    @Override
    public Book getObject() throws Exception {
        Book book = new Book();
        book.setBookName(UUID.randomUUID().toString());
        return book;
    }

    /*
    getObjectType 返回创建对象的类型
    spring自动调用来确认这个对象的类型
     */
    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }

    /*
    isSingleton:是单例吗?

     */
    @Override
    public boolean isSingleton() {
        return true;
    }
}

然后在容器中注册

<!-- FactoryBean(是spring指定的一个接口)
        只要是这个接口的实现类,spring都认为是一个工厂
        ioc容器启动的时候,不会创建实例,在获取的时候才创建实例
    -->
    <bean class="com.lzt.factory.BookFactoryImple" name="bookFactoryImple"></bean>

在代码中获取airplane对象就是,直接获取工厂name即可

Book book = (Book) ioc3.getBean("bookFactoryImple");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值