2021-10-23

工厂模式解耦案例

解耦方式:工厂+配置文件+接口

package com.ermao.dao;

//员工模块dao层接口
public interface EmpDao { 
    
    public void addEmp();
    
}
package com.ermao.dao;

//员工模块dao层实现类
public class EmpDaoImpl implements EmpDao {
    
    public void addEmp() {}
    
}
package com.ermao.service;

//员工模块service层接口
public interface EmpService { 
    
    public void addEmp();
    
}
package com.ermao.service;

import com.ermao.dao.EmpDao;
import com.ermao.dao.EmpDaoImpl;
import com.ermao.factory.BeanFactory;

//员工模块service层实现类
public class EmpServiceImpl implements  EmpService{
    //    private EmpDao dao = new EmpDaoImpl();
    //    获取Dao接口的子类实例,这里使用new对象的方式造成了程序之间的耦合性提升
    private EmpDao dao = (EmpDao) BeanFactory.getBean( "EmpDao" );  
    public void addEmp() {  
        System.out.println("调用dao层的方法添加员工信息...");     
        dao.addEmp();   
    }
}
package com.ermao.controller;

import com.ermao.factory.BeanFactory;
import com.ermao.service.EmpService;
import com.ermao.service.EmpServiceImpl;
import org.junit.Test;

//模拟表现层
public class EmpController {
    //    private EmpService service = new EmpServiceImpl();
    //    获取Dao接口的子类实例,这里使用new对象的方式造成了程序之间的耦合性提升    
    private EmpService service = (EmpService) BeanFactory.getBean("EmpService"); 
    
    @Test    
    public void testAddEmp() {  
        System.out.println("调用service层的方法添加员工信息...");                             service.addEmp();    
    }
}

工厂类

package com.ermao.factory;

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

public class BeanFactory {
    //声明一个Properties对象,在静态代码块中对其进行初始化
    private static Properties prop;
    static {
        try {
            //为prop进行实例化
            prop = new Properties();
            //获取配置文件的流对象
            InputStream in = BeanFactory.class.getClassLoader()
                    .getResourceAsStream("config.properties");
            //将配置文件中的内容读取到Properties对象中
            prop.load( in );
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("初始化Properties对象失败!");
        }
    }

    /**
     * 根据config.xml文件中的key获取对应class类的实例
     * @param key
     * @return
     */
    public static Object getBean(String key) {
        Object bean = null;
        try {
            String className = prop.getProperty( key );
            bean = Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

 resources配置文件

EmpService=com.ermao.service.EmpServiceImpl
EmpDao=com.ermao.dao.EmpDaoImpl
上一篇:springboot+mybatis+thymeleaf模板之经典小项目实战教程


下一篇:如何简化嵌套的php数组?