`

抽象工厂(转)

阅读更多

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

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

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

Java代码
// 角色表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语句所以实现时必须分数据库来实现

Java代码
// 用户表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)

Java代码
// 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. 定义配置文件

Java代码
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

Java代码
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
分享到:
评论

相关推荐

    抽象工厂之数据库转换例子

    抽象工厂模式是设计模式中的一种,属于创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。在本例子中,我们关注的是如何在MySQL和Oracle这两种不同的数据库之间进行转换。这个Java程序通过抽象工厂...

    抽象工厂 SQL 和Access 利用泛型读取表中数据 WCF发布出去

    在这个场景中,"抽象工厂 SQL 和 Access" 指的是利用抽象工厂模式来创建与SQL Server和Microsoft Access数据库交互的对象。这种方式的好处在于,我们可以根据需求切换不同的数据库系统,而不需要修改大量代码,因为...

    BS酒店管理系统源代码(抽象工厂模式,三层结构)

    而“抽象工厂模式”是设计模式的一种,常用于创建相关或依赖对象的家族,无需指定其具体类。此外,“三层结构”通常是指数据访问层、业务逻辑层和表示层的架构设计,使得系统结构清晰,易于维护和扩展。 【描述】中...

    六层架构 三层架构 C# 抽象工厂应用 实例

    本文将深入探讨两种常见的架构模式——六层架构和三层架构,并结合C#编程语言以及抽象工厂设计模式,展示它们在实际项目中的应用。 首先,让我们从六层架构开始。六层架构是一种将软件系统分解为六个独立层次的方法...

    CodeSmith基于三层的抽象工厂模版

    在本案例中,我们关注的是"基于三层的抽象工厂模板",这涉及到软件架构设计中的分层模式以及抽象工厂设计模式。 首先,三层架构是软件设计中常见的架构模式,主要包括表现层(Presentation Layer)、业务逻辑层...

    23种设计模式之抽象工厂模式Java示例代码

    ### 23种设计模式之抽象工厂模式Java示例代码详解 #### 概述 抽象工厂模式(Abstract Factory Pattern)是面向对象设计模式中的一个重要成员,属于创建型模式的一种。它提供了一种创建一系列相关或相互依赖对象的...

    概括设计模式,举例详解抽象工厂模式

    ### 概述设计模式:以抽象工厂模式为例深入解析 设计模式是在软件工程领域中,为解决特定问题而总结出的、经过验证的解决方案。它们是开发者在长期实践中提炼出来的智慧结晶,旨在提高代码的可读性、可维护性和可...

    jsp+mysql+sql2005+java+抽象工厂

    【标题】:“jsp+mysql+sql2005+java+抽象工厂”这一主题涵盖了Web开发中的多个核心技术,包括Java服务器页面(JSP)、MySQL数据库、SQL Server 2005以及面向对象设计模式中的抽象工厂。这些技术的结合使用在构建...

    c#,三层架构,抽象工厂,序列化于反序列化程序

    在IT行业中,三层架构、抽象工厂模式以及序列化与反序列化是软件开发中的关键概念。下面将详细解析这些知识点。 首先,三层架构是一种常见的软件设计模式,它将应用程序分为三个逻辑层:表现层(Presentation Layer...

    抽象工厂,适配器,命令,工厂方法,观察者,代理

    本篇文章将详细讲解六个重要的设计模式:抽象工厂、适配器、命令、工厂方法、观察者和代理,以及它们在Java编程中的应用。 1. **抽象工厂(Abstract Factory)**: 抽象工厂模式提供一个创建一系列相关或相互依赖...

    C#三层架构+自动生成sql语句+抽象工厂

    本项目结合了C#的三层架构、自动生成SQL语句以及抽象工厂设计模式,为初学者提供了一个很好的学习实例。 首先,让我们深入理解一下三层架构。三层架构是一种软件设计模式,将应用程序分为三个主要部分:表现层...

    .Net三层简单工厂ppt,适合初学者

    1. 创建抽象工厂项目,定义抽象产品接口和抽象工厂接口。 2. 创建实体工厂项目,实现抽象工厂接口,生产具体的实体产品。 3. 在实体产品中实现抽象产品接口,完成实际的功能。 4. 业务逻辑层调用抽象工厂创建所需的...

    Head First 设计模式 JAVA源码

    第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理...

    课后题目六1

    本题涉及到四种创建型模式:工厂方法模式、抽象工厂模式、适配器模式和单例模式。下面将详细阐述这四种模式的基本概念和应用场景。 1. **工厂方法模式**: 工厂方法模式是一种类的创建型模式,它定义了一个创建...

    .net抽象缓存工厂redis、httpruntime

    本文将深入探讨.NET中抽象缓存工厂如何与Redis和HttpRuntime结合使用,以及如何在实际项目中应用这些概念。我们将通过提供的代码示例来理解整个流程。 首先,我们关注的是"ICache.cs",这是一个接口文件,它定义了...

    java 设计模式之工厂模式

    本篇文章将深入探讨Java中的一个基础设计模式——工厂模式,以及它的一些变体,如简单工厂模式和抽象工厂模式,并结合Java的反射机制进行讲解。 首先,工厂模式的核心思想是提供一个创建对象的接口,但让实现这个...

    java工厂设计模式.doc

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式**:在简单工厂模式中,一个具体的工厂类负责创建所有需要的对象。它根据一定的条件(如参数、配置等)来决定创建哪种...

    反射简单工厂模式工厂模式

    `factorymethod`文件可能包含了一个抽象工厂类及其多个实现子类,每个子类对应一种产品类型,它们各自实现了工厂方法来创建对应的产品对象。 总结起来,"反射"提供了一种在运行时动态操作对象和类的能力,常用于...

    几个设计模式c++实现源码

    以下是对标题和描述中提到的三个设计模式——抽象工厂模式、适配器模式和外观模式的详细解释: 1. 抽象工厂模式: 抽象工厂模式是一种创建型设计模式,它提供一个接口来创建相关或依赖对象的家族,而无需指定它们的...

    工厂模式的测试并有spring ioc的简单实现

    工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式**(simpleFactory):这种模式中,我们通常定义一个工厂类,它根据传入的参数来决定创建哪种具体的产品对象。简单工厂模式适用于产品...

Global site tag (gtag.js) - Google Analytics