[转]Spring中工厂模式简介

工厂模式作用:
核心思想:实例化对象
需求:
1.多例对象的创建
2.有些对象 例如接口/抽象类不能直接实例化 接口–代理 抽象类–创建子类
3.需要对对象进行二次封装
静态工厂:
说明: 静态工厂必须有静态方法。
调用方式:类名.静态方法
例:
(1)建立工厂类

package com.jt.manage.factory;

import java.util.Calendar;

public class StaticFactory {
    public static Calendar getInstance(){
        return Calendar.getInstance();
    }
}

(2)交给Spring管理
配置xml文件

<!--配置静态工厂  -->
<bean id="calendarA" class="com.jt.manage.factory.StaticFactory" factory-method="getInstance" />
 

静态工厂可以通过类名.静态方法的形式获取对象,因此只需要将静态工厂对象交给Spring管理,并提供静态工厂方法即可。
实例工厂:
说明:实例化工厂要求必须先创建工厂对象,之后通过工厂方法调用获取对象
(1)建立工厂类

package com.jt.manage.factory;

import java.util.Calendar;

public class InstanceFactory {
    public  Calendar getInstance(){
        return Calendar.getInstance();
    }
}

(2)交给Spring管理
配置xml文件

<!--配置实例化工厂  -->
    <bean id="instanceFactory" class="com.jt.manage.factory.InstanceFactory"></bean>
    <bean id="calendarB" class="com.jt.manage.factory.InstanceFactory" factory-bean="instanceFactory" factory-method="getInstance"></bean>

实例工厂需要将工厂对象交给Spring管理,然后建立bean对象,将工厂对象和工厂对象的获取对象方法交给其即可。
Spring工厂:
说明:该模式有spring内部调用,不需要做多余的配置但是需要实现特定的接口FactoryBean。
(1)建立工厂类

public class CalendarFactory implements FactoryBean<Calendar> {

    @Override
    public Calendar getObject() throws Exception {
        // TODO Auto-generated method stub
        return Calendar.getInstance();
    }

    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return Calendar.class;
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return false;
    }

(2)交给Spring管理

<!--配置spring工厂  -->
<bean id="calendarC" class="com.jt.manage.factory.CalendarFactory"></bean>

FactoryBean接口需要实现三个方法并制定工厂管理的对象泛型。
isSingleton()方法:用于指定对象是否为单例,单例对象由Spring创建、存储并管理;多例对象Spring只负责创建,不负责销毁。
getObjectType() 方法:若对象为单例,则在Spring容器关闭时调用此方法,获得该对象的class对象并通过class对象寻找所有该类对象进行删除。
getObject()方法:获取对象。
工具类测试:

  @Test
    public void testFactory(){
        //1.实例化Spring容器
        ApplicationContext context = 
                new ClassPathXmlApplicationContext("spring/factory.xml");
        Calendar calendarA = (Calendar) context.getBean("calendarA");
        System.out.println(calendarA.getTime());
        
        Calendar calendarB = (Calendar) context.getBean("calendarB");
        System.out.println(calendarB.getTime());
        
        Calendar calendarC = (Calendar) context.getBean("calendarB");
        System.out.println(calendarC.getTime());
    }
原文地址:https://www.cnblogs.com/binghuaZhang/p/14068834.html