Spring框架之工厂模式

简单的工厂模式

        工厂模式:把原来分布在各个地方的对象的创建过程单独抽离出来,统一交给工厂类来创建所需的对象。 (需要使用对象的时候,不要自己去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("奔驰,停下了!");

    }
}

 

Spring框架之工厂模式_第1张图片 都实现接口的这三个方法

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

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();
    }

结果Spring框架之工厂模式_第2张图片 

 

 

对比两种方法的优缺点:

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();
    }

 

Spring框架之工厂模式_第3张图片

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

 

你可能感兴趣的:(spring,spring,java,后端)