抽象工厂模式(java)
刚才看了13shu的抽象工厂模式,感觉很不错,个人感觉通俗易懂,以前一直搞不明怎么回事,看了这篇文章,大致明白怎么回事了,接下来把这篇文章分享给大家。
工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准.
以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列)
1.首先定义相关接口(与平常的做法没什么区别)
- // 角色表DAO接口
- interface IroleDao {
- void insert();
- void update();
- }
- // 用户表DAO接口
- interface IuserDao {
- void find();
- void delete();
- }
// 角色表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 对角色表更新数据");
- }
- }
// 用户表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();
- }
- }
// 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 {
- // Oralce
- static final String ORALCE = "org.abc.OracleFactory";
- static final String MYSQL = "org.abc.MysqlFactory";
- }
class Config { // Oralce static 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();
- }
- }
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
转自:http://13shu.iteye.com/blog/200119
相关推荐
### 23种设计模式之抽象工厂模式Java示例代码详解 #### 概述 抽象工厂模式(Abstract Factory Pattern)是面向对象设计模式中的一个重要成员,属于创建型模式的一种。它提供了一种创建一系列相关或相互依赖对象的...
在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统对具体产品的依赖降到最低,增强系统的可扩展性和可维护性。 首先,我们来理解一下抽象工厂模式的主要组成: 1. **抽象工厂(Abstract ...
总的来说,这份压缩包提供了一个Java实现的抽象工厂模式实例,通过学习和理解这个例子,你可以深入掌握抽象工厂模式的原理和使用场景,这对于提升你的Java编程能力以及软件设计水平非常有帮助。在实际项目中,灵活...
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...
抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂...
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
在C++和Java这两种编程语言中,抽象工厂模式的应用相当广泛,特别是在需要跨平台或者需要一组相关的对象协同工作时。 首先,我们来看看C++中的抽象工厂模式。在C++中,我们通常通过定义接口(纯虚函数)来实现抽象...
在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于同一族,并且能够遵循相同的接口,但具体的实现可以不同。 首先,我们来理解一下抽象工厂模式的主要组成: 1. **抽象工厂(Abstract Factory...
本文将深入探讨Java中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。这样,客户端无需...
用反射机制改进的抽象工厂
在"JAVA设计模式之抽象工厂模式"的示例中,可能会包含这些角色的实现以及如何在实际场景中应用抽象工厂模式的解释和示例代码。这个压缩包可能包含了详细的设计和实现,帮助学习者深入理解抽象工厂模式的工作原理及其...
在Java中,我们可以用类和接口来实现抽象工厂模式。 首先,我们定义一个抽象工厂接口,比如`AbstractFactory`,它声明了一系列创建产品的方法,这些产品是相互关联或依赖的。例如: ```java public interface ...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在实际应用中,当我们需要创建一组具有共同特性的对象,而这些对象分别...
在Java编程中,抽象工厂模式通常包括以下几个关键角色: 1. 抽象工厂(Abstract Factory):这是抽象接口,定义了创建一组相关或相互依赖对象的接口,而不必指定它们的具体类。 2. 具体工厂(Concrete Factory):...
在Java中,抽象工厂模式被广泛应用,它有助于整合代码,提高系统的可扩展性和可维护性。 标题所指的“肯德基”,在这里并不是指真实的餐饮连锁品牌,而是作为抽象工厂模式的一个例子。通过把肯德基生产各种食物的...
在C++和Java这两种流行的面向对象编程语言中,我们可以看到抽象工厂模式的不同实现方式。 在C++中,抽象工厂通常通过接口(纯虚函数)来定义,这些接口代表了不同类型的工厂,每个工厂负责创建一类相关的产品。例如...
在Java中,抽象工厂模式通常包含以下角色: 1. **抽象工厂(Abstract Factory)**:这是工厂模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。在这个例子中,这个接口可能是`Abstract...
抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方法,而无需指定它们的具体类。在计算器的实现中,这个模式可以帮助我们构建不同类型的计算器,比如简单计算器、科学计算器等,而无需修改现有代码。 ...
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。...抽象工厂模式java demo用于学习