Java工厂类:通用工厂的使用2

以上一篇工厂为基础:创建通用的工厂方法并使用:

BeanFactory类,工厂类:

package com.itheima;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
工厂类中:new UserServiceImpl();也出现了耦合

对象的创建方式:
  1.直接调用构造函数 创建对象 UserService userService=new UserServiceImpl()
  2.通过反射方式创建对象 反射可以解耦合
     Class clazz=Class.forName("com.itheima.UserServiceImpl");//获取类对象
     UserService userService=clazz.newInstance();

 */
public class BeanFactory {
    private static Properties env=new Properties();//创建Properties集合

    //读取properties文件
     //通过代码块来读取io避免重复性打开io,并且在程序启动的时候一次性读取想要的内容,可以通过静态代码块
    static{
        try {
            //1.获取IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //2.文件内容封装到Properties集合里面 问价当中的key作为将集合的key,文件中的值作为集合的值
            env.load(inputStream);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
   /*
    //解 SpringTest类的耦合
    public static UserService getUserService(){

        //return new UserServiceImpl();出现耦合

        UserService userService=null;
        try {
            //为解决这个耦合可以把这个全限定名称写到一个配置文件properties里面
            Class clazz=Class.forName(env.getProperty("userService"));//传入全限定名,以后可以换成新的类,也需要手动改变,这里页出现耦合
            userService=(UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }


    //解UserServiceImpl类 的耦合
    public static UserDAO getUserDAO(){
        UserDAO userDAO=null;

        try {
            //为解决这个耦合可以把这个全限定名称写到一个配置文件properties里面
            Class clazz=Class.forName(env.getProperty("userDAO"));//传入全限定名,以后可以换成新的类,也需要手动改变,这里页出现耦合
            userDAO=(UserDAO) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userDAO;
    }

    */

    //发现以上代码出现大量重复代码,可以通过创建一个通用的方法来解耦合,就可以不用重复创建类似的方法
    //通用工厂方法
    public static Object getBean(String key){
        Object ret=null;
        try {
            Class clazz=Class.forName(env.getProperty(key));//传入全限定名,以后可以换成新的类,也需要手动改变,这里页出现耦合
            ret=(Object) clazz.newInstance();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return ret;
    }

}

 UserServicesImpl类:

package com.itheima;

public class UserServiceImpl implements UserService {

    //private UserDAO userDAO=new UserDAOImpl();//这里也会出现耦合,需要工厂类解耦合

    //使用工厂类解耦合
    //private UserDAO userDAO=BeanFactory.getUserDAO();

    //通用工厂方法
    private UserDAO userDAO=(UserDAO) BeanFactory.getBean("userDAO");


    @Override
    public void regist(User user) {
        userDAO.save(user);
    }

    @Override
    public void login(String name, String password) {
        userDAO.queryUserByNameAndPassword(name,password);
    }
}

创建一个Person类:

package com.itheima;

public class Person {
}

applicationContext.properties:

#properties 通过key和values 组成
#properties 集合 存储Properties文件内容
#特殊的Map key=value
#通过:
#   Properties.getProperty("userService");获取值


userService=com.itheima.UserServiceImpl
#后续如果需要跟换实现类只需要更改实现类的全限定名称

userDAO=com.itheima.UserDAOImpl

#Person类
person=com.itheima.Person

SpringTest类:

package com.itheima;

import org.junit.Test;

public class SpringTest {
    /*
     测试工厂类进行耦合操作:
       有了耦合,可以通过工厂类设计模式:通过工厂类创建对象
     */
    @Test
    public void test1(){
        //把这个接口的实现类编码到了程序当中,就出现偶合:比如以后要换一个实现类的时候,那么测试类也跟着改变
        //要换一个实现类UserServiceImplNew 需要替换下面的代码为UserService userService=new UserServiceImplNew();
        //经过修改后项目经过重新编译和部署,不符合面向对象设计开闭原则:打开扩展,关闭修改
       // UserService userService=new UserServiceImpl();//这一行代码出现耦合

        /*
          通过工厂类: 解决耦合
         */
        UserService userService= (UserService) BeanFactory.getBean("userService");


        userService.login("name","suns");

        User user=new User("suns","123456");
        userService.regist(user);


    }

    @Test
    public void test2(){
        Person person = (Person) BeanFactory.getBean("person");
        System.out.println("Person="+person);
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值