java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度
一、什么是耦合
程序之間的依賴關系:
①類之間的依賴
②方法之間的依賴
注意:
不可能完全的消除依賴關系,而只能是降低程序之間的依賴關系
二、解耦
降低程序之間的依賴關系:
1.解決類之間的依賴關系:
①通過讀取配置文件來獲取要創建對象的全限定類名
②使用反射來創建類的對象,盡量避免new關鍵字的使用
三、問題引出
1.新建Maven項目
2.修改配置文件,添加如下代碼,讓程序打包成Jar包的形勢
jar
3.開始編寫實驗代碼,整體架構如下:
3.持久層接口
package com.huhai.Dao;
/**
*持久層接口
*/
public interface IAccountDao {
public abstract void save();
}
4.持久層接口實現類
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
/**
* 持久層實現類
*/
public class AccountDaoImpl implements IAccountDao {
public void save() {
System.out.println("數據保存成功");
}
}
5.業務層接口
package com.huhai.Service;
/**
*業務層接口
*/
public interface ISaveAccountService {
public abstract void save();
}
6.業務層接口實現類
package com.huhai.Service.Impl;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.ISaveAccountService;
/**
* 業務層實現類
*/
public class AccountServiceImpl implements ISaveAccountService {
private AccountDaoImpl accountDao = new AccountDaoImpl();
public void save() {
accountDao.save();
}
}
7.表現層
package com.huhai;
import com.huhai.Service.Impl.AccountServiceImpl;
public class Realize {
private static AccountServiceImpl accountService;
public static void main(String[] args) {
accountService = new AccountServiceImpl();
accountService.save();
}
}
可以看出,它們之間的依賴關系非常嚴重,因此需要解耦
四、使用工廠模式降低程序耦合度
1.項目架構
2.工廠類:
package com.huhai.Factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 一個創建Bean對象的工廠
* 它就是創建Server和Dao對象的
*/
public class BeanFactory {
/**
* 定義Properties對象
*/
private static Properties properties;
/**
* 使用靜態代碼段為properties賦值
*/
static {
/**
* 實例化對象
*/
properties = new Properties();
/**
* 獲取properties流對象
* 最好不要直接new,因為傳路徑的時候,路徑是一個容易出錯的地方
* 因為配置文件在resources根目錄下,所以可以直接填寫文件名字bean.properties作為參數
* 使用類加載器來獲得文件的路徑
*/
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
properties.load(in);
} catch (IOException e) {
/**
* 配置文件如果出錯,則沒有必要繼續運行
* 拋出錯誤,終止整個程序
*/
throw new ExceptionInInitializerError("初始化異常");
}
}
/**
* 使用工廠模式創建對象
* 因為返回的對象不一定是一個類,所以返回值類型為Object或者泛型
* 根據bean的名稱獲取bean對象
*/
public static Object getBean(String beanName){
/**
* 初始化返回對象
*/
Object bean = null;
/**
* 根據傳入的beanName參數獲取properties中的對應類的全限定類名
*/
String beanPath = properties.getProperty(beanName);
try {
bean = Class.forName(beanPath).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
工廠類升級版——工廠類的單例模式
package com.huhai.Factory;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 一個創建Bean對象的工廠
* 它就是創建Server和Dao對象的
*/
public class BeanFactory {
/**
* 定義Properties對象
*/
private static Properties properties;
/**
* 定義一個Map,使之能夠存放已經實例化的對象
* 該Map即為容器
* 該容器的建造是為了完成工廠的類的單例模式
*/
private static Map beans;
/**
* 使用靜態代碼段為properties賦值
*/
static {
try {
/**
* 實例化對象
*/
properties = new Properties();
/**
* 獲取properties流對象
* 最好不要直接new,因為傳路徑的時候,路徑是一個容易出錯的地方
* 因為配置文件在resources根目錄下,所以可以直接填寫文件名字bean.properties作為參數
* 使用類加載器來獲得文件的路徑
*/
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
properties.load(in);
/**
* 配置文件如果出錯,則沒有必要繼續運行
* 拋出錯誤,終止整個程序
*/
/**
*
*/
beans = new HashMap();
Enumeration keys = properties.keys();
/**
* 遍歷所有的keys
*/
while(keys.hasMoreElements()){
String key = keys.nextElement().toString();
//根據配置文件得到指定類的全限定類名
String property = properties.getProperty(key);
//使用反射實例化對象
Object obj = Class.forName(property).newInstance();
//將對象放進倉庫
beans.put(key, obj);
}
}catch (Exception e){
throw new ExceptionInInitializerError("初始化properties失敗!");
}
}
/**
* 使用工廠模式創建對象
* 因為返回的對象不一定是一個類,所以返回值類型為Object或者泛型
* 根據bean的名稱獲取bean對象
*/
public static Object getBean(String beanName){
//根據bean的名稱獲取bean單例對象
return beans.get(beanName);
}
}
3.持久層接口
package com.huhai.Dao;
/**
*持久層接口
*/
public interface IAccountDao {
public abstract void save();
}
4.持久層接口實現類
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
/**
* 持久層實現類
*/
public class AccountDaoImpl implements IAccountDao {
public void save() {
System.out.println("數據保存成功");
}
}
5.業務層接口
package com.huhai.Service;
/**
*業務層接口
*/
public interface IAccountService {
public abstract void save();
}
6.業務層接口實現類
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Factory.BeanFactory;
import com.huhai.Service.IAccountService;
/**
* 業務層實現類
*/
public class AccountServiceImpl implements IAccountService {
/**
* 使用工廠模式創建對象,降低程序耦合度
*/
private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDaoImpl");
public void save() {
accountDao.save();
}
}
7.表現層
package com.huhai;
import com.huhai.Factory.BeanFactory;
import com.huhai.Service.IAccountService;
public class Realize {
public static void main(String[] args) {
/**
* 為了解耦,使用工廠模式創建對象
*/
IAccountService accountService = (IAccountService) BeanFactory.getBean("accountServiceImpl");
accountService.save();
System.out.println(accountService);
}
}
8.bean.properties配置文件
#鍵(key)用小寫
accountServiceImpl=com.huhai.Service.Impl.AccountServiceImpl
accountDaoImpl=com.huhai.Dao.Impl.AccountDaoImpl
總結
以上是生活随笔為你收集整理的java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 语言笔记: 链表节点实现技巧--st
- 下一篇: STM32与MS5837压力传感器的I2