设计模式之 抽象工厂 封装业务逻辑层和Dao层
生活随笔
收集整理的這篇文章主要介紹了
设计模式之 抽象工厂 封装业务逻辑层和Dao层
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般情況下軟件應該盡量遵循以下的設計原則:?開閉原則(OCP)
- ? 對擴展開放,對修改關閉
里氏替換原則(LSP)
- ? 任何類出現的地方,子類一定可以出現(is-a)
依賴倒轉原則(DIP)
- ? 盡量依賴抽象,不要依賴具體
接口隔離原則
- ? 接口盡量小,不要提供大的接口,使通信盡可能窄
合成復用原則
- ? 盡量采用合成和聚合的方式達到利用,而不要使用繼承的方式達到利用
迪米特法則
- ? 一個軟件實體盡可能少的與其它實體發生作用
抽象工廠:實現多個產品的創建?優點:對產品的增加支持OCP原則?缺點:對產品系列的增加不支持OCP原則 抽象工廠的示意圖如下:?下面是一個抽象工廠生產Manager和DAO的示例:
在classpath下創建一個xml文件bean_config.xml,當我們每建立一個Manager和DAO時就在這里配置類信息 <?xml version="1.0"encoding="UTF-8"?> <bean> <manager-class> <manager id="gd.hz.manager.ItemsManager"class="gd.hz.manager.ItemsManager"></manager> </manager-class> <dao-class> <dao id="gd.hz.dao.ItemsDAO"class="gd.hz.dao.ItemsDAO"></dao> </dao-class> </bean> ? 創建工廠BeanFactory(接口省略),使用dom4j讀取配置文件: package gd.hz.util;import java.io.InputStream; import java.util.HashMap; import java.util.Map;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;public class BeanFactory {// 使用單例private static BeanFactory beanFactory = new BeanFactory();private final String beanConfigFile ="bean_config.xml";// 存放Manager實例集合private Map<String, Object> managerMap = new HashMap<String, Object>();// 存放DAO實例集合private Map<String, Object> daoMap = new HashMap<String, Object>();private Document document = null;private BeanFactory() {// 初始化SAXReaderSAXReader reader = new SAXReader();InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(beanConfigFile);try {document = reader.read(in);} catch (DocumentException e) {e.printStackTrace();}}public static BeanFactory getInstance() {return beanFactory;}// 傳入配置文件中id屬性的名稱,配置class屬性,用反射產生對象.public synchronized Object getManagerObj(String managerName) {// 若存在實例則反回.if (managerMap.containsKey(managerName)) {return managerMap.get(managerName);}// 讀取配置文件Element el = (Element) document.selectSingleNode("/bean/manager-class/manager[@id='"+ managerName +"']");String className = el.attributeValue("class");Object manager = null;try {// 反射半生實例manager = Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("類加載失敗!!");}// 放入容器中.managerMap.put(managerName, manager);return manager;}public synchronized Object getDaoObj(String daoName) {if (daoMap.containsKey(daoName)) {return daoMap.get(daoName);}Element el = (Element) document.selectSingleNode("/bean/dao-class/dao[@id='"+ daoName +"']");String className = el.attributeValue("class");Object dao = null;try {dao = Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("類加載失敗!!");}managerMap.put(daoName, dao);return dao;} } ?測試:
public static void main(String[] args) { //從工廠獲取BeanItemsManager itemsManager = (ItemsManager)BeanFactory.getInstance().getManagerObj(ItemsManager.class.getName()); }總結
以上是生活随笔為你收集整理的设计模式之 抽象工厂 封装业务逻辑层和Dao层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈一谈:抽象工厂+反射+配置文件 实现数
- 下一篇: 抽象工厂+反射+依赖注入 实现对数据访问