一般情况下软件应该尽量遵循以下的设计原则:
开闭原则(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()); }
相关推荐
抽象工厂模式可以用来创建不同数据库(如SQL SERVER2005)的DAO(数据访问对象)实例,提供一个接口,让业务逻辑层无须关心具体的数据访问方式。例如,你可能有多个数据库供应商,如SQL Server、Oracle或MySQL。每个...
DAO(Data Access Object)抽象工厂是一种设计模式,它在软件工程中用于创建DAO对象的类工厂。DAO模式的主要目的是为了封装对数据源的访问,使得业务逻辑层与数据存储层解耦,提高代码的可测试性和可维护性。在Java...
DAO(Data Access Object)设计模式是软件开发中一种常见的用于处理数据访问的模式,它将业务逻辑与数据访问逻辑分离,使得代码结构更加清晰,更易于维护和测试。在Java开发中,DAO模式广泛应用于数据库操作,为应用...
DAO(Data Access Object)模式是一种常见的软件设计模式,主要用于封装对数据库的操作,使得业务逻辑层与数据访问层解耦,提高代码的可复用性和可维护性。在Java开发中,DAO模式通常由一个接口定义,然后由具体的...
DAO(Data Access Object)设计模式是一种在软件工程中常见的用于处理数据访问的模式,它将业务逻辑和数据访问逻辑分离,使得系统更加模块化,提高了代码的可复用性和可测试性。在这个“DAO设计模式(工厂+代理)”...
"Hibernate封装DAO层"就是将Hibernate的功能整合到DAO设计模式中,以实现更加高效、规范的数据库操作。 1. **DAO设计模式**: DAO模式是软件设计模式的一种,它的核心思想是创建一个独立于具体数据库操作的对象,...
在Java Web开发中,MVC(Model-View-Controller)三层架构和DAO(Data Access Object)工厂模式是两种常见的设计模式,它们对于构建高效、可维护的系统至关重要。本项目结合这两种模式,旨在提高代码组织的清晰度和...
DAO设计模式使得业务逻辑与数据访问逻辑分离,这样,如果数据库发生变化(如从MySQL切换到Oracle),只需要修改DAO实现,而不会影响到Service层和其他业务组件。 **6. 测试** 由于DAO提供了抽象,因此在单元测试时...
1. **清晰的分层**:通过将数据访问逻辑封装到DAO层,使得业务逻辑层更加简洁,专注于业务逻辑处理,而不需要关心具体的数据库操作。 2. **高内聚低耦合**:DAO模式通过接口与实现分离的设计,降低了各层之间的耦合...
在软件设计模式中,工厂模式和DAO(Data Access Object)模式是两种常用的设计模式,它们在实际开发中扮演着至关重要的角色。工厂模式是创建型设计模式,它提供了一种创建对象的最佳方式,而DAO模式则是一种数据访问...
暴露给客户端的DAO接口在低层数据源的实现发生改变时并不会随着改变,所以这种设计模式使得DAO可以适应不同的数据储存方式类型而不影响客户端和商业组件.最主要的, DAO还在组件和数据源之间扮演着协调者的角色. DAO...
DAO(Data Access Object)设计模式是一种软件设计模式,主要用于数据库操作的封装,它将业务逻辑与数据访问逻辑分离开来,使得代码更加模块化,易于维护。DAO模式在实际开发中广泛应用,尤其是在Java和.NET等面向...
DAO层是系统架构的关键组件之一,负责对数据库的访问和操作,使得业务逻辑层和数据访问层分离,提高系统的可维护性和可扩展性。 二、DAO层的设计原则 1.抽象化:抽象化是DAO层的设计原则之一,抽象化可以使得DAO层...
DAO(Data Access Object)模式是一种常见的软件设计模式,它在J2EE应用中被广泛使用,旨在分离业务逻辑层与数据访问层,提高代码的可复用性和可维护性。DAO模式的核心思想是通过接口来定义数据访问的抽象,然后由...
### 设计模式之抽象工厂详解 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。其中,“抽象工厂”模式是创建型模式之一,它提供了一种方式来封装一系列对象的创建过程,同时允许...
《J2EE核心模式》是一本深入探讨Java企业级应用程序开发的经典著作,其中DAO(Data Access Object)模式是重要的设计模式之一。DAO模式的主要目的是为了解耦业务逻辑层和数据访问层,提高代码的可维护性和可测试性。...
DAO(Data Access Object)设计模式是一种在Java编程中常见的用于处理数据访问的模式,它将业务逻辑组件与数据访问逻辑分离,提供了一种抽象层,使得应用代码与具体的数据存储方式解耦。DAO模式的核心思想是创建一个...
在Java企业级开发中,"核心J2EE模式-DAO(数据访问对象)"是一个至关重要的设计模式,它主要用于分离业务逻辑层与数据存储层之间的交互。DAO模式是Java开发中的一个经典模式,尤其在大型分布式系统和企业级应用中被...
总结来说,DAO设计模式在J2EE应用中起着至关重要的作用,它将数据访问逻辑封装在独立的对象中,降低了业务逻辑与数据存储之间的耦合,便于代码的维护、测试和扩展。通过接口的定义和工厂模式的应用,我们可以更加...
DAO(数据访问对象)模式是Java项目开发中常见的设计模式,主要用于处理数据库交互,实现业务逻辑层与数据访问层的解耦,以及跨数据库平台的移植。该模式的核心思想是将对数据库的操作封装在独立的DAO类中,从而隐藏...