`

关于java工厂方法设计模式的问题

阅读更多

关于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中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心...

    Java 工厂设计模式例题

    例题简单的阐述了Java工厂模式的概念,有利于读者更好地了解Java工厂模式

    设计模式——工厂方法模式

    工厂方法模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是当系统需要创建的对象具有多种类型,而具体创建哪种类型的对象在运行时才能确定的问题。在这个压缩包中,`FactoryMethod`可能包含了Java...

    设计模式之java工厂模式

    "设计模式之java工厂模式"是关于如何优雅地创建对象的一种经典设计模式,它属于创建者模式类别。创建者模式主要关注对象的创建,而工厂模式则在其中扮演着重要角色,因为它提供了一种抽象的方式来创建对象,从而使...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    java版本的设计模式的实现demo

    以下是关于Java版本设计模式实现demo的一些补充说明: 1. 设计模式分类 设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建;结构型模式关注类或对象的组合;行为型模式则关注类或...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在现代软件开发领域中,设计模式作为一整套为开发者提供针对特定问题解决方案的模板或最佳实践,其重要性不言而喻。尤其在Java这样面向对象的编程语言中,设计模式更是被广泛应用。本篇文章将对标题与描述中提到的几...

    工厂方法模式java实例demo

    Java作为一款强大的面向对象编程语言,非常适合实现各种设计模式,包括工厂方法模式。在这个“工厂方法模式java实例demo”中,我们可以期待看到如何在实际代码中应用这一模式。 在刘伟老师的《设计模式》一书中,他...

    java设计模式之工厂方法模式

    工厂方法模式是面向对象设计中的一种经典设计模式,属于创建型模式。它的主要目的是将对象的创建过程封装起来,使得创建过程独立于使用过程。在Java中,工厂方法模式允许我们定义一个创建对象的接口,但让实现这个...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象的创建问题,将对象的创建过程封装起来,使得创建过程独立于使用过程。这样可以提高代码的可复用性和灵活性,同时降低了系统的耦合度。...

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...

    设计模式-工厂模式 Java源码

    设计模式是软件开发中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。工厂模式是设计模式中的一种创建型模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码无需关心具体对象的创建细节,...

    java三种工厂模式文档+三个实例.rar

    Java工厂模式是面向对象设计模式中的一个重要概念,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不直接实例化具体类,而是通过一个接口或者抽象类来间接创建。这种模式的核心在于将对象的创建过程...

    工厂方法模式Java代码

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个工厂类负责创建对象,而具体的创建过程被延迟到子类中实现。这种模式的关键在于封装了对象的创建过程,并允许在运行时...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    在软件设计模式中,工厂模式是一种非常...在实际项目中,工厂模式经常与其他设计模式(如策略模式、建造者模式等)结合使用,以解决更复杂的问题。阅读并理解这些代码有助于深入理解工厂模式及其在Java编程中的应用。

    设计模式之工厂模式Java实现和类设计图

    在软件开发中,设计模式是经验丰富的开发者们总结出的解决常见问题的模板或最佳实践。工厂模式作为其中的一种,是对象创建型模式,它的主要目的是为了隔离对象创建过程与客户端之间的关系,使得创建过程更加灵活,...

Global site tag (gtag.js) - Google Analytics