使用工厂模式解耦。
一、需求场景:
某一层功能需要改动,但其他层代码不变
-
实现类1:
MyDaoImpl
查询自己的数据库.改为>
实现类2:
MyDaoImpl2
从其它地址得到数据.
二、步骤:
1.创建一个BeanFactory
类,Bean工厂
service层:
private MyDao dao = BeanFactory.getBean();
class BeanFactory{
public static Object getBean(){
Class clazz = Class.forName("com.mysite.dao.impl.MyDaoImpl");//有硬编码问题
Object obj =clazz,newInstance();
return obj;
}
}
2.解决硬编码问题,进一步优化解耦
提供一个配置文件:
beans.properties
内容:
myDao=com.mysite.dao.impl.MyDaoImpl2
//解决硬编码问题,进一步解耦
service层
private MyDao dao = BeanFactory.getBean("myDao");
class BeanFactory{
public static Object getBean(String key){
//读取beans.properties文件,得到Properties properties;
Properties properties = BeanFactory.class.
String clazzName = properties.getProperty(key);
Class clazz = Class.forName(clazzName);
Object obj = clazz.newInstance();
}
}
三、理论
1.导入-----使用接口开发:
- 好处:方便进行功能拓展,提供新的实现类,提供新功能
- 问题:service层里创建dao对象的代码需要随之调整
- 层与层之间耦合性比较强
2.解决思路:
- 在service层创建对象时,使用反射创建对象,
- 提供一个配置文件: key对应
dao的全限定类名
- 想创建什么
dao
,就提供一个key,通过BeanFactory
类得到key对应的dao
对象. -
好处:
-
dao
再拓展,又增加了新的实现类.我们只需要修改配置文件即可. - 其它service代码、
BeanFactory
代码都不需要变更.
-
- 耦合性降低了
3.工厂模式
Spring框架的两大核心
IoC
:Inversion of Control,控制反转,解耦
- 由原来主动创建对象,变成被动接收对象.把创建对象的控制权交出去了.