Spring框架之工厂模式

本文介绍了工厂模式在Spring框架中的应用,通过对比简单的工厂模式和配置文件驱动的工厂模式,阐述了如何通过工厂类创建对象,以及不同模式的优缺点。首先,展示了常规模式创建对象Factory01的方式,然后探讨了简单工厂模式,通过接口实现类的动态创建。最后,讨论了通过配置文件实现的工厂模式,它允许灵活地根据配置信息创建对象,而无需修改工厂方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的工厂模式

        工厂模式:把原来分布在各个地方的对象的创建过程单独抽离出来,统一交给工厂类来创建所需的对象。 (需要使用对象的时候,不要自己去new,通过工厂(方法)来创建对应的对象)

1.常规模式创建对象Factory01

第一步:提供一个Factory01类,用于提供User对象的方法

package com.lr.spring.factory01;

public class Factory01 {
    //提供User对象的方法
    public static User getUserInstance(){
        return new User();
    }
}

第二步:直接new对象即可

public class FactoryTest01 {
    @Test
    public void testFactory01(){
        User user = new User();
        User user2= Factory01.getUserInstance();
    }

测试结果 

 

2.简单工厂模式

第一步:先写一个Car接口类 

package com.lr.spring.factory02;

public interface Car {
    void start();
    void run();
    void stop();
}

第二步:创建接口的各种实现类 

 

package com.lr.spring.factory02;

public class Benz implements Car {
    @Override
    public void start() {
        System.out.println("奔驰,发动了!");
    }

    @Override
    public void run() {
        System.out.println("奔驰,在行驶!");

    }

    @Override
    public void stop() {
        System.out.println("奔驰,停下了!");

    }
}

 

 都实现接口的这三个方法

第三步:根据外界传入参数的不同,创建不同的实现类

package com.lr.spring.factory02;

public class Factory02 {
    //根据外界传入参数的不同,创建不同的实现类
    public static Car getCarInstance(String str) {
        Car car = null;
        if ("QQ".equals(str)) {
            car = new QQ();
        } else if ("Bmw".equals(str)) {
            car = new Bmw();
        } else if ("Benz".equals(str)) {
            car = new Benz();
        }
        return car;
    }
}

测试

 @Test
    public void testFactory02(){
        Car car= Factory02.getCarInstance("QQ");
        car.start();
        car.run();
        car.stop();
    }

结果 

 

 

对比两种方法的优缺点:

factory01缺点:只能提供单一的对象

factory02缺点:通过接口的方式,提供该接口实现类的对象,但每次创建一个新该接口的实现类,都要去修改提供对象的方法

 所以我们还需要一种新的方式:工厂模式

第一步:提供一个配置文件

Benz=com.lr.spring.factory02.Benz
Bmw=com.lr.spring.factory02.Bmw
QQ=com.lr.spring.factory02.QQ
OOOO=com.lr.spring.factory02.OOOO

第二步:创建工厂模式提供创建对象的方法

package com.lr.spring.factory03;
import com.lr.spring.factory02.Car;
import com.lr.spring.factory02.QQ;
import java.io.FileInputStream;
import java.util.Properties;
public class Factory03 {
//    Properties 集合的工具类用来存储集合信息,用来操作.properties(k=v)文件,tonggk获取对应的v
    public static Car getCarInstance(String str) throws Exception{
        //1.创建Properties集合对象
        Properties properties=new Properties();
        //2.加载(读取)car.Properties,把配置文件信息统一加载到了Properties集合对象中
        properties.load(new FileInputStream("D:\\code\\spring01\\src\\main\\resources\\car.properties"));
        System.out.println(properties);
        //3.参数str就相当于Properties文件中的k值获取对应的v值
        //包名.类名(类的全限定名)
        String value= properties.getProperty(str);
        //4.反射创建对象    Class.ForName(包名.类名).newInstance()
        //根据包名.类名创建该类的反射对象
        Car car=(Car) Class.forName(value).newInstance();
        return new QQ();
    }
}

 测试

   @Test
    public void testFactory03() {
        Car car= null;
        try {
            car = Factory03.getCarInstance("QQ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        car.start();
        car.run();
        car.stop();
    }

 

 factory03:解决了不管创建该接口多少个实现类,永远都不需要修改工厂中创建对象的方法。
根据配置信息,任意来编写该接口的实现类,根据接口实现类的的信息来创建对象的实现类对象。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值