<p>这篇文章主要介绍了如何基于Spring使用工厂模式实现程序解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下</p>
<p><strong>1、 啥是耦合、解耦?<br>
</strong></p>
<p>既然是程序解耦,那我们必须要先知道啥是耦合,耦合简单来说就是程序的依赖关系,而依赖关系则主要包括</p>
<p>1、 类之间的依赖<br>
</p>
<p>2、 方法间的依赖</p>
<p>比如下面这段代码:</p>
<div class="blockcode">
<pre class="brush:java;">
public class A{
public int i;
}
public class B{
public void put(A a){
System.out.println(a.i);
}
}</pre>
</div>
<p><br>
上面这个例子中A类和B类之间存在一种强耦合关系,B类直接依赖A类,B类的put方法非A类类型不可,我们把这种情况叫做强耦合关系。</p>
<p>实际开发中应该做到:编译期不依赖,运行时才依赖。怎么理解呢?我们很容易想到多态向上转型,是的,编译时不确定,运行时才确定,当然接触面更广一点的童鞋会想到接口回调,是的接口回调方式也能有效的解耦!如下代码:</p>
<div class="blockcode">
<pre class="brush:java;">
//一个接口叫做Inter,里面定义了一个happy()方法,有两个类A、B实现了这个接口
interface Inter{
void happy();
}
class A implements Inter{
@Override
public void happy() {
System.out.println("happy...A");
}
}
class B implements Inter{
@Override
public void happy() {
System.out.println("happy...B");
}
}
public class Test{
public void happys(Inter inter){
inter.happy();
}
}</pre>
</div>
<p>是的,如上代码正是典型的接口回调,Test类中的happys方法参数变的相对灵活起来,代码中Test类与A类、B类之间就存在一种弱耦合关系,Test类的happys方法的参数可以使A类类型也可以是B类类型,不像强耦合关系中非A类类型不可的情形。</p>
<p>从某一意义上来讲使用类的向上转型或接口回调的方式进行解耦都是利用多态的思想!</p>
<p>当然解耦的方式还有很多,从根本意义上讲实现低耦合就是对两类之间进行解耦,解除类之间的直接关系,将直接关系转换成间接关系,从而也有很多设计模式也对程序进行解耦,比如:适配器模式、观察者模式、工厂模式....总之,必须明确一点:耦合性强的程序独立性很差!</p>
<p><strong>2、 jdbc程序进行解耦<br>
</strong></p>
<p>先来看一段代码:</p>
<div class="blockcode">
<pre class="brush:java;">
//1、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //如果把jdbc的MySQLjar包依赖去除直接编译失败提示没有mysql
//2、获取连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/ufida","root","root");
//3、获取操作数据库的预处理对象
PreparedStatement pstm=conn.prepareStatement("select * from client");
//4、执行SQL,得到结果集
ResultSet rs=pstm.executeQuery();
//5\遍历结果集
while(rs.next()){
System.out.println(rs.getString("name"));
}
//6、释放资源
rs.close();
pstm.close();
conn.close();</pre>
</div>
<p>等等等等,好熟悉好怀念的代码.....</p>
<p>没错就是jdbc的代码,不是用来怀旧的,而是如果这样设计,你会觉得这样的程序耦合性如何?又如何进行解耦?先仔细思考一番。</p>
<p>一分钟过去了.....<br>
</p>
<p>两分钟过去了.....</p>
<p>好了,我们都知道jdbc连接MySQL需要一个mysql-connector的jar包,如果我们把这个jar包依赖或者这个jar包给去掉,显然上面的这个程序会编译报错,如下图<br>
</p>
<p style="text-align: center"><img alt="" height="707" src="https://201903.oss-cn-hangzhou.aliyuncs.com/js/2426819-fea3e0a64066d147d89026a63aaefaaf" width="1375"><br>
</p>
<p>显然这样的程序耦合性过高!于是我们可以这样设计,将第一步的注册驱动代码new的方式改成反射的方式如下:</p>
<div class="blockcode">
<pre class="brush:java;">
//1、new的方式注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //如果把jdbc的MySQLjar包依赖去除直接编译失败提示没有mysql相关的jar包
改为如下方式
//2、反射的方式注册驱动
Class.forName("com.mysql.jdbc.Driver"); //改用这种方式注册驱动会发现不会编译失败,相比上面的方式相对解耦,但是依然存在缺陷:若连接改为Oracle数据库,这里的字符串又要进行改动!</pre>
</div>
<p>正如注释的解释一样,又一个缺陷就浮现了:若连接改为Oracle数据库,这里的字符串又要进行改动!</p>
<p>于是对于这个jdbc程序来说就有这样的一个解耦思路:</p>
<p>第一步:通过反射来创建对象,尽量避免使用new关键字<br>
</p>
<p>第二步:通过读取配置文件来获取创建的对象全限定类名</p>
<p><strong>3、传统dao、service、controller的程序耦合性</strong><br>
</p>
<p>顺着jdbc程序的解耦思路,我们再来看 |
|