设计模式之 抽象工厂 封装业务逻辑层和Dao层

原创 2015年11月18日 19:30:10

一般情况下软件应该尽量遵循以下的设计原则: 开闭原则(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() {


// 初始化SAXReader


SAXReader 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) {
//从工厂获取Bean

ItemsManager itemsManager = (ItemsManager)BeanFactory.getInstance().getManagerObj(ItemsManager.class.getName());
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

工厂模式之DAO设计

为DAO实现工厂类的策略 1 采用工厂方法设计模式 如果一个DAO 工厂只为一个数据库的实现,(比如ORACLE)而创建很多的DAO的时候,实现该策略时,我们考虑采用工厂方法设计模式. 假设...

DAO层与Service业务逻辑层的解耦实现之Factory工厂模式

为什么在MVC的三层开发架构中会非常推崇接口编程,那么根据已有的解释,接口编程的好处是:可以帮助层与层之间的解耦,让每个部分独立出来,互不影响,更加的利于团队开发合作和提高复用性与扩展性。那么,在数据...

抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行。 我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层和数...
  • lmdcszh
  • lmdcszh
  • 2012年01月03日 11:06
  • 4125

抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行。 我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层...
  • judyge
  • judyge
  • 2015年11月06日 20:40
  • 285

hjr学习-设计模式:业务逻辑层

数据持久化想要软件或系统重启后不丢失的数据需要做数据持久化,可以保存到数据库、文件等里面。数据持久化一般有两种: - DBHelper:这种比较经典,就是写一个类专门负责数据库各种操作,比如增删改...
  • hjrcrj
  • hjrcrj
  • 2016年11月09日 22:31
  • 184

java深入浅出设计模式----简单的工厂模式(一)----业务逻辑分离

现在可扩展性和可维护性特别强,即便是想要计算多个数,那也很容易了,改动的地方很少。而且还能防止恶意的程序员篡改代码。 如果需要进行两个以上的数字的运算,在该接口中添加方法就行了。 package ...

基于命令模式的业务逻辑层设计

基于命令模式的业务逻辑层设计问题   1.业务发展太快,需求不停的在变   目前作的业务系统业务逻辑非常复杂,网站承载的用户访问量也在逐渐增大,更要命的是需求的不确定性,天天都有新需求,每次的改动量都...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之 抽象工厂 封装业务逻辑层和Dao层
举报原因:
原因补充:

(最多只允许输入30个字)