关于java工厂方法设计模式的问题
http://www.programfan.com/club/showpost.asp?id=27112
今天看java编程思想中的接口时,理解不了工厂方法设计模式,希望有人能来帮忙解答下。
书上的代码说的是在一个相同的棋盘上下国际象棋和西洋跳棋,
interface Game{...}
interfacd GameFactory{...}
class Checkers implements Game{...}
class CheckersFactory implements GameFactory
{
public Game getGmae() {return new Checkers();}
}
class Chess implements Game{...}
class ChessFactory implements GameFactory
{
public Game getGmae() {return new Chess();}
}
public class Games
{
public static void playGame(GameFactory factory)
{ Game s=factory.getGame();
}
public static void main(...)
{playGame(new CheckerFactory); playGame(new ChessFatory);}
}
这是书上的代码,我省略了一些跟我问题无关的代码。
我的问题是为什么要这么麻烦,给Checkers和Chess都弄个工厂,然后从工厂里返回类型,可以直接把public static void playGame(GameFactory factory) 改成
public static void playGame(Game factory)不就可以了吗?然后playGame(new CheckerFactory); playGame(new ChessFatory);改成playGame(Checkers);
playGame(Chess); 利用向上转型原理。这样不是可以把上面的那些Factory代码全删掉么?另外Factory模式到底有什么用处。
可能是我没有理解工厂方法设计模式。希望有人能来回答下。
【kinzz】:
看你的例子更像是Abstract factory pattern,而不像是工厂方法设计模式factory method pattern。
在你的例子里,如你所说的改动,看似没什么问题,在这里game的构造过程很简单new SomeGame()。
首先工厂模式在于其封装了其产品(game)的构造过程。
考虑到复杂的构造过程,例如SomeGame构造需要配置多个参数,那么getGame就要通过相应的途径去取得这些参数,例如读取配置文件。
在这种情况下,对于用户main来说,就可以简单的获得Game而不需要清楚如何取构造它。
另一点,工厂模式在于其提供一个构造产品的方法。例如你做的是一个游戏服务器,playGame会等待用户连接,然后为每一个用户连接创建一个Game,那么你可以简单的gameFactory.getGame,而如果你把Game作为参数传递就完全不同了。
【bao110908】:
这段程序据我的理解,并没有深刻地表达工厂方法意义,可能让你产生了误解。按照你的方法来改也未尝不可,但是它主要讲的是工厂方法啊,所以就必须采用工厂来实现。
下面这些是原来帮别人回答类似问题时用到的代码,你可以参考一下:
原文地址:http://community.csdn.net/Expert/TopicView3.asp?id=5658401
工厂方法指的是根据不同的情况产生不同的对象,比如:
public static Dao getDao(String dbmsName) throws UnsupportDatabaseException {
if( dbmsName.equalsIgnoreCase("SQL Server") ) {
return new SqlServerDao();
} else if( dbmsName.equalsIgnoreCase("Oracle") ) {
return new OracleDao();
} else if( dbmsName.equalsIgnoreCase("MySQL") ) {
return new MySQLDao();
} else {
throw new UnsupportDatabaseException(dbmsName);
}
}
其中 Dao 是 SqlServerDao、OracleDao、MySQLDao 的接口。
上面这段代码就是一个典型的工厂方法,通过传入的数据库名称来确定,并获得不同的数据库处理实现。若使用的数据库并没有实现,则进行异常处理。
不过一般不会这样写,这里仅作个示例。我基本上是把当前 Dao 的实现类写在 XML 中,在进行动态加载类操作,使用工厂返回 Dao 对象的。
如果是一个写得比较好的工厂方法,要符合“开-闭原则”,在新增实现类后,只需更改配置,而原来写好的源代码根本不需要去修改。
【clevercong】:
代码是thinking in java 4th里介绍工厂设计模式的那一段。
经过楼上两位大哥的讲解,我已经明白了。
thinking in java 4th翻译的太烂了,我明白后再看了看书上的话也明白了书上的意思,但是讲解的太含糊不清了
分享到:
相关推荐
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
例题简单的阐述了Java工厂模式的概念,有利于读者更好地了解Java工厂模式
Java实现的工厂模式,抽象工厂,工厂方法模式
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...
这个是http://blog.csdn.net/dawanganban/article/details/9877593博客中java设计模式的源代码。下载前请先看《设计模式——工厂方法模式》一文。
设计模式之工厂模式Java实现和类设计图,包括简单工厂模式、工厂方法模式和抽象工厂模式
基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等 Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式...
工厂方法模式java实例demo,来自刘伟老师的《设计模式》一书.rar
java工厂设计模式之简单工厂实例以及介绍,程序已经运行过能正常跑通
工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而...
通过实际例子说明工厂方法模式,并解释工厂方法的原理,特点和使用场景。
java 抽象工厂设计模式 的 案例 源码,值得一看,看完你就懂了,嘿嘿
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
Java设计模式05工厂方法模式
java,设计模式中的一种,工厂设计模式。
Java设计模式中的工厂模式,MainDemo.java 是项目演示入口