欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工厂模式+反射工厂

程序员文章站 2022-03-09 21:57:32
...

工厂模式

优点:解耦合
使用方法:通过工厂类来创建 *接口实现类

传统代码编写方式:

①定义接口-UserService

public interface UserService {
    void login(String name,String password);
    void register(User user);
}

②定义实现类-UserServiceImp1

public class UserServiceImp1 implements UserService {

    @Override
    public void login(String name, String password) {
        System.out.println("name:"+name+",password:"+password);
    }

    @Override
    public void register(User user) {
        System.out.println(user.toString());
    }
}

③使用

@Test
    public void abc(){
        //创建对象
        UserService userService = new UserServiceImp1();
        userService.login("name","password");
        User user = new User("eason","fukua");
        userService.register(user);
    }

可以看出耦合在UserService userService = new UserServiceImp1();中(若UserServiceImp1()实现类的名字发生改变,则需要修改的地方太多了。A.java或者B.java或者C.java如果都用了,那么都要Ctrl+C Ctrl+V)
如果可以只修改一处,就可以达到修改所有,那就好了!

简单工厂实现

①定义工厂类

public class BeanFactory {
    public static UserService getUserServiceImp1(){
        return new UserServiceImp1();
    }
}

②使用

public void abc(){
        //创建对象
        UserService userService = BeanFactory.getUserServiceImp1();
        userService.login("name","password");
        User user = new User("eason","fukua");
        userService.register(user);
    }

可以有效防止耦合,可是在步骤一中。return new UserServiceImp1();还是会出现耦合。(若多个工厂都返回UserServiceImp1())那就要修改很多。
有没有更好的方法?

反射工厂

将工厂类中的定义方法改成反射
①修改工厂类定义方法

public static UserService getUserServiceImp1() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        UserService userService;
        Class clazz = Class.forName("com.example.studyspring0904.Imp.UserServiceImp1.java");
        userService = (UserService)clazz.newInstance();
        return userService;

   }

②测试

public void abc() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //创建对象
        UserService userService = BeanFactory.getUserServiceImp1();
        userService.login("name","password");
        User user = new User("eason","fukua");
        userService.register(user);
    }

运用配置文件来完善反射工厂

①创建applaction.properties
在resources文件夹内
kv形式 写入

userService = com.example.studyspring0904.Imp.UserServiceImp1

②在工厂类中载入配置文件

public class BeanFactory {
    public static Properties env = new Properties();
    // 建一个静态的配置文件类
    static {
        // 第一步 获得IO输入流
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/application.properties");
        // 第二步 文件内容封装Properties集合中,key=userService
        try {
            env.load(resourceAsStream);
            resourceAsStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static UserService getUserServiceImp1() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        UserService userService;
        Class clazz = Class.forName(env.getProperty("userService"));
        // 指定配置文件中的K V,
        userService = (UserService)clazz.newInstance();
        return userService;
    }
}

这样以后修改 就可以只对application.properties中的
userService = com.example.studyspring0904.Imp.UserServiceImp1修改

相关标签: java