JiveJdon Community Forums
在线436人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
1 2 Go 总共有 15 回复 / 2
 发表新帖子   回复该主题贴
manbaum

悄悄话
发表文章: 36
注册时间: 2003年03月21日 16:49
综合使用抽象工厂、工厂方法的应用 2003年04月18日 13:37 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 factory模式(34)     

假设有一个应用,需要对数据库进行操作。虽然操作的表是一样的,但是,不同的用户连接的库可能不同,还可能不同的数据库存在于不同的数据库系统上。如何来实现呢?综合抽象工厂、工厂方法的使用,我们得到以下解决方法。


/*
* 抽象工厂,定义对数据库的各种操作。
*/

public Interface Operations
{
public int operation1();
public void operation2(String paramString1);
// ... 其他操作 ...
}

/*
* 工厂方法,根据不同数据库系统及数据库,建立操作工厂。
*/

public class OperationsFactory
{
public static final int DBMS_MYSQL = 1;
public static final int DBMS_MSSQL = 2;
public static final int DBMS_ORACLE = 3;

// 工具类,禁止实例化
private OperationsFactory()
{
}

public static Operations getOperations(int dbms, String dbName)
{
Operations op;
switch (dbms)
{
case DBMS_MYSQL:
// ... 获得 MySQL 数据库实现 ...
op = new MysqlOperations(dbName);
break;
case DBMS_MSSQL:
// ... 获得 Microsoft SQL Server 数据库实现 ...
op = new MssqlOperations(dbName);
break;
case DBMS_ORACLE:
// ... 获得 Oracle 数据库实现 ...
op = new OracleOperations(dbName);
break;
default:
throw new Exception(
"Unsupported dbms: " + dbms);
}
return op;
}
}

/*
* 抽象工厂的具体实现,针对 MySQL 数据库系统。
* 类似的可以有针对 M$ SQL Server 及 Oracle 的具体实现。
*/

public class MysqlOperations implements Operations
{
private Connection conn;

public MysqlOperations(String dbName)
{
// ... 根据 dbName 生成连接
conn = ...
}

// ... 实现接口方法 operation1 ...
public int operation1()
{
// 使用 conn 对数据库进行操作 ...
}

// ... 实现接口方法 operation2 ...
public void operation2(String paramString1)
{
// 使用 conn 对数据库进行操作 ...
}
}


这样,用户无须知道它连接的具体数据库系统以及数据库名,就可以执行他需要的操作(使用抽象工厂接口),完成他自身的任务。具体使用何数据库系统上的哪个库,在用户登录后,由管理者指定(使用工厂方法工具类)。
banq

悄悄话
发表文章: 9524
注册时间: 2002年08月03日 17:08
Re: 综合使用抽象工厂、工厂方法的应用 2003年04月28日 16:39 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
好,不错,鼓掌......
bruce

悄悄话
发表文章: 191
注册时间: 2003年05月28日 09:53
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月11日 09:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
抽象产品在哪里?是不是Connection ? 好象又不象,似乎没有吧?
如果没有的话,我认为就不是一般的抽象工厂方法了,因为它的两个首要因素就是抽象产品,抽象工厂.并且所有的具体工厂类都要返回抽象产品,我倒不是死扣定义,只是觉得长得不和一般的抽象工厂一样罢了。
airport

悄悄话
发表文章: 26
注册时间: 2003年06月02日 13:55
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月11日 14:23 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
说几点看法,请多指教
关于你的抽象工厂 Interface Operations
我觉得本身定义太具体化了,违反面向对象的原则
因为你对数据库的操作,本身是一个具体的过程
定义在抽象工厂里面,我想如果以后扩展起来肯定很麻烦
所以不同数据库的操作,还是不适合用这个模式吧,应该是
bridge模式吧。
bruce

悄悄话
发表文章: 191
注册时间: 2003年05月28日 09:53
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月11日 20:19 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我倒不觉得Interface Operations定义的太具体化,因为具不具体或抽不抽象取决于定义的方法operate1, operate2抽象程度。

感觉上面的代码只能称做工厂方法模式,根本没有抽象工厂模式。

呵呵,看到bridge模式,我就想起来斑主给咱们的加奶的咖啡,收益非浅呀。
richardluopeng

悄悄话
发表文章: 71
注册时间: 2002年08月30日 15:52
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月16日 10:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
请楼主告诉我

客户端是怎么调用的,谢谢!
eastxing

悄悄话
发表文章: 2
注册时间: 2003年06月16日 10:33
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月16日 16:16 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
客户端的调用就很简单了:
Operations mysqlop = OperationsFactory.getOperations(MYSQL,"tt");
mysqlop.operation1();
mysqlop.operation2();
……

感觉就是用的工厂方法,由“数据库类型”和“数据库名”生成操作对象。如果再掩藏“数据库类型”,建立工厂这边的类结构(例如建立一个共同的数据库的基类,按数据库类型建立不同的工厂),那就是抽象工厂了。不过我觉得也没有必要,楼主的实现已经不错了,支持!
richardluopeng

悄悄话
发表文章: 71
注册时间: 2002年08月30日 15:52
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月17日 09:20 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
抽象工厂在哪里??
Lijm

悄悄话
发表文章: 3
注册时间: 2003年06月16日 11:53
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月17日 09:52 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
一点看法,
这种方式象是一个共同的函数而已,并没有体现出抽象工厂的思想。
如果这个模块要拓展,该怎么呢?比如说是增加一种数据库,是不是要更改代码了,没有体现“关--闭”原则。
a_fan_ti

悄悄话
发表文章: 3
注册时间: 2003年06月18日 12:38
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月18日 13:09 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我觉得这是一个简单工厂
richardluopeng

悄悄话
发表文章: 71
注册时间: 2002年08月30日 15:52
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月18日 18:39 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我仔细看了一下,抽象工厂和一个简单工厂的应用
richardluopeng

悄悄话
发表文章: 71
注册时间: 2002年08月30日 15:52
Re: 综合使用抽象工厂、工厂方法的应用 2003年06月18日 18:41 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
我认为


public static Operations getOperations(int dbms, String dbName)
{
}

是一个简单工厂,不是工厂方法
Fish

悄悄话
发表文章: 16
注册时间: 2003年07月24日 19:18
Re: 综合使用抽象工厂、工厂方法的应用 2003年07月25日 09:40 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
yes!! 这就是一个简单工厂。 非常典型的一个简单工厂。楼主除了把它认为是抽象工厂这个错误外,其它做的都非常好。

更正一下:

> 就可以执行他需要的操作(使用抽象工厂接口),完成他自身的任务

这里好像应该是

就可以执行他需要的操作(使用抽象产品接口),完成他自身的任务

大家认为呢?
ruby

悄悄话
发表文章: 12
注册时间: 2003年07月24日 09:39
Re: 综合使用抽象工厂、工厂方法的应用 2003年07月25日 10:17 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
是一个Simple Factory的应用,写的例子和阎宏的《java与模式》中提到的水果家场例子是一样的。就是由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例.
ruby

悄悄话
发表文章: 12
注册时间: 2003年07月24日 09:39
Re: 综合使用抽象工厂、工厂方法的应用 2003年07月25日 10:24 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
to manbaum
请教一下,你程序中的
// 工具类,禁止实例化
private OperationsFactory()
{
}
这儿为什么要禁止实例化?如果可以实例化,会带来什么后果?
这个主题有 15 回复 / 2Go 1 2
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  每2分种自动备份发贴内容Ctrl-V粘贴取出,提问题前先查询标签列表

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam