工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准.

以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列)

1.首先定义相关接口(与平常的做法没什么区别)

// 角色表DAO接口
interface IroleDao {void insert();void update();
}
// 用户表DAO接口
interface IuserDao {void find();void delete();
}

2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现

// 用户表Oralce数据库DAO
class OracleuserDao implements IuserDao {public void delete() {System.out.println("Oralce 删除用户表数据");}public void find() {System.out.println("Oralce 查询用户表数据");}
}// 用户表MySql数据库DAO
class MySqluserDao implements IuserDao {public void delete() {System.out.println("MySql 删除用户数据");}public void find() {System.out.println("MySql 查询用户数据");}
}
// 角色表Oracle数据库DAO
class OracleroleDao implements IroleDao {public void insert() {System.out.println("Oralce 对角色表插入数据");}public void update() {System.out.println("Oracle 对角色表更新数据");}
}// 角色表MySql数据库DAO
class MySqlroleDAO implements IroleDao {public void insert() {System.out.println("MySql 对角色表插入数据");}public void update() {System.out.println("Mysql 对角色表更新数据");}
}

这里增加了一套DAO的实现 (与平时有所不同,如果有10个数据库就要加上10种不同的实现,比较麻烦呀)

3.定义DAO工厂接口与实现(利用java反射机制生产出你需要的DAO如:userDAO,roleDao)

// DAO工厂
abstract class DaoFactory {public static DaoFactory getInstance(String classname) {DaoFactory dao = null;try {dao = (DaoFactory) Class.forName(classname).newInstance();} catch (Exception e) {e.printStackTrace();}return dao;}abstract IuserDao getuserdao();abstract IroleDao getroledao();
}// Oralce工厂
class OracleFactory extends DaoFactory {public IroleDao getroledao() {return new OracleroleDao();}public IuserDao getuserdao() {return new OracleuserDao();}
}// MySql工厂
class MysqlFactory extends DaoFactory {public IroleDao getroledao() {return new MySqlroleDAO();}public IuserDao getuserdao() {return new MySqluserDao();}
}

4. 定义配置文件

class Config {// Oralcestatic final String ORALCE = "org.abc.OracleFactory";static final String MYSQL = "org.abc.MysqlFactory";
}

配置文件可以定义到XML中去(好处:修改配置项之后不需要对JAVA文件进行编译.)

5.测试你的输出的DAO

public class Dao {public static void main(String[] args) {DaoFactory.getInstance(Config.ORALCE).getroledao().insert();DaoFactory.getInstance(Config.MYSQL).getroledao().insert();}}

总结

使用条件:一系列接口有一系列的实现
如上IuserDao、IroleDao等一系列的接口,他们可以有一系列的实现(Oracle方式、MySql方式)

OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
组成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列实现:Oracle系列、MySql系列
系列工厂类:Oracle系列工厂类、MySql系列工厂类(必须继承抽象工厂类)
抽象工厂类:DaoFactory

java设计模式---抽象工厂模式相关推荐

  1. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  2. Java设计模式——抽象工厂模式

    文章目录 抽象工厂 概念 优缺点 优点 缺点 适用场景 代码案例 抽象工厂 使用工厂方法模式足以应付我们可能遇到的大部分业务需求. 但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是 ...

  3. 程序设计之Java设计模式(抽象工厂模式)

    原文地址:http://zhangwei-david.iteye.com/blog/2187627,该文通俗易懂,实为经典! 在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互 ...

  4. Java设计模式--抽象工厂模式

    抽象工厂模式(别名:配套) 提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类. Abstract Factory Pattern(Another Name: Kit) Provide a ...

  5. JAVA设计模式 - 抽象工厂模式

    抽象工厂模式(Abstact Factory Pattern) , 也是创建型模式之一 . 之前主要介绍了工厂方法模式 , 抽象工厂模式和工厂方法模式稍有区别 . 工厂方法模式中工厂类生产出来的产品都 ...

  6. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  7. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  8. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. Java设计模式之工厂模式篇 (转)

    Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿  本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...

最新文章

  1. 第一篇,试试功能如何
  2. 自动滑动图片html5,html+css+js 实现自动滑动轮播图
  3. centos java发送邮件发不出去_传真机发不出传真怎么办 传真机发不出传真解决方法【详解】...
  4. HTTP访问一个网站的过程详解
  5. mysql deadlock found when trying to get lock 问题排查
  6. SQLServer之事务简介
  7. Java API 设计清单
  8. java replacefirst第n_Java中replace()、replaceFirst()和replaceAll()区别
  9. 面试问题:Spring中Bean 的生命周期
  10. 【机器学习】集成学习--随机森林(Random Forest)
  11. linux ping策略打开_Linux Iptables允许或阻止ICMP ping请求
  12. 会议OA项目之我的审批(查询会议签字)
  13. jboss下载和安装
  14. 黑莓7100T激活上网、彩信设置(转)
  15. DIADEM_metric不能运行及解决办法
  16. 语句覆盖,判定覆盖,条件覆盖,条件/判定覆盖,条件组合覆盖,路径覆盖
  17. 第二章:如何解构一篇目标论文,从而开启自己的论文写作
  18. drupal html5,基于Drupal 7HTML5布局模板二次开发.doc
  19. 计算机资源管理器总是未响应,资源管理器总是无响应,而且开机很慢老是解决不了问题...
  20. 26岁程序员猝死,再次提醒:有几个前兆其实很显眼

热门文章

  1. 美国中央情报局CIA正通过开发人工智能项目,收集与检索社交媒体情报
  2. 快速让你明白Objective-C的语法(和Java、C++对比)
  3. QCon上海2015十大热点
  4. int **a[3][4] 和 sizeof(a) 和 int(**)a[3][4]
  5. Python算法和数据结构:在二叉树中找到和为sum的所有路径
  6. 几个步骤,让你的 iOS 代码容易阅读
  7. Scala中Manifest、ClassTag、TypeTag的学习
  8. docker容器互联实战
  9. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态
  10. Linux常见面试题2