一般情况下软件应该尽量遵循以下的设计原则:
开闭原则(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()); }
相关推荐
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 要您一个资源分,也算是对我的尊重,谢谢下载。
三层架构及设计模式(抽象工厂实现) <br> 1. 三层架构实现,把表现层(WebUI)与数据访问层(DAL)分开,使用业务逻辑进行处理(BLL), 避免了把数据信息暴露在表现层, 从而提供了程序的性能,使用业务逻辑...
IOS 设计模式抽象工厂实例Demo IOS 设计 模式 抽象 工厂
JAVA设计模式之抽象工厂模式,一个不错的列子,逻辑比好清晰,让你更好的理解抽象工厂
NET设计模式之抽象工厂模式[归纳].pdf
设计模式-抽象工厂模式(讲解及其实现代码)
设计模式——抽象工厂模式源码,设计模式——抽象工厂模式源码
设计模式--抽象工厂模式实现多数据库连接 设计模式,.net设计模式,抽象工厂
设计模式 - 抽象工厂模式
java设计模式之抽象工厂模式实例,希望对大家有所帮助。
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
单例设计模式、工厂设计模式和抽象工厂模式是常见的软件开发设计模式。这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一...
设计模式之抽象工厂模式
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
用vs2005和SQLserver2000编写的抽象工厂三层模式酒店管理系统,实现了简间的的管理功能
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...
Java设计模式之抽象工厂模式
设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)