【问题标题】:Linking two Abstract Factory Patterns in Java在 Java 中链接两个抽象工厂模式
【发布时间】:2009-03-28 21:22:24
【问题描述】:

我正在编写一个引用匹配程序,其中需要两个抽象工厂模式,这是两个接口; QuoteFactoryModeFactory。 ModeFactory 在 EasyModeHardMode 之间切换,QuoteFactory 挑选出几个不同主题之间的 Quotes(即 PoliticalQuotes、SportsQuotes)。简而言之,用户将选择一种模式,如果选择 EasyMode,则用户必须猜测报价,而如果用户选择 HardMode,则告诉用户是谁说的,然后必须猜测,所以 Quotes 的实现将根据模式以及所选的报价而变化。

到目前为止,我已经将 ModeFactory 创建为接口并将其实现为 EasyMode 和 HardMode,但现在我需要以某种方式将另一个抽象工厂模式(或更多)集成到这些模式中,以便可以选择引用。如果有帮助,我还创建了一个 Quote 类,其中定义了我的 Quotes。

谁能帮我想出这些抽象工厂的基本实现?这是我到目前为止的大纲,虽然我不禁觉得我以某种方式把它复杂化了......

编辑:澄清我的意思:如果用户选择简单模式,那么他们会获得报价的开头和该报价的作者,而如果他们选择困难模式,他们只会提供报价单。例如

简易模式: “我感受到了……的力量” 何塞·穆里尼奥

困难模式: “我感受到了……的力量”

hard 模式不会让作者让用户更难猜出报价的其余部分。另外,这不是学校作业。我一直在阅读 Head First Design Patterns,现在我正在尝试将我学到的知识应用到不同的情况中(而不是他们的 Pizza 示例,我正在研究一个 Quote Guessing Game,在阅读完 QI(英国电视节目) 书。

public interface ModeFactory {
    public Mode retrieveMode(String s); 
}

public interface QuoteFactory {
    public Quote retrieveQuote(String s);
}

【问题讨论】:

  • 我不明白问题模式。简易模式:出现报价,用户必须选择正确的作者?困难模式:出现作者,用户必须选择正确的引用?每种情况下都有可能的答案列表吗?
  • 在简单模式下,作者会得到报价的第一部分,然后用户可以猜测报价,而在困难模式下,只给出报价的开头。跨度>
  • 你在说方言。 “报价的第一部分”和“只是报价的开头”有什么区别?
  • 简单模式提供名称(例如 Jose Mourinho)和引语的前三个单词供用户猜测。困难模式会给出相同的引用,但没有作者。

标签: java design-patterns factory


【解决方案1】:

你能后退一步,重述你正在尝试做的事情吗?我有时会发现,通过努力向不熟悉挑战的人解释挑战,解决方案自然而然地出现在我面前。

从您的描述来看,您似乎是从部分解决方案开始(“我想使用抽象工厂模式”),而不是从您真正想做的事情开始(例如,“我想提供报价根据 Flavor(政治、体育)和模式(简单、困难)提供不同报价的类")。

在我看来,它就像一个枚举,而不是一个工厂。 {political,sports} 有一个枚举,mode 有一个单独的枚举。

编辑:再次考虑这个问题后,也许这是一个学校作业(“使用抽象工厂模式来......等等等等”),这就是你开始的原因用一个半解决方案。

【讨论】:

  • 这不是学校作业。我正在研究 Head First Design Patterns,而不是他们的 Pizza 示例,我正在尝试根据我的 QI(英国电视节目)书中的引言用 Java 创建一个 Quote 程序。
【解决方案2】:

您可能在这里过度设计。你首先需要的是一个 Quote 类。这应该封装引用,并且应该有适当的访问器(getter),无论是简单模式还是困难模式。然后你需要一个报价集合。如果这些都保存在数据库中,您可以轻松选择引用的类型。

我也认为 ModeFactory 是不必要的。为什么您需要一个界面来在两种模式之间进行选择?状态标志更简单。

【讨论】:

    【解决方案3】:

    没有太多思考,并试图保持你的设计,这样的事情怎么样(我假设 Quote 类有 getText() 和 getAuthor 方法,你也可能想让它 getText(int numberOfWords) 所以你可以配置报价多少):

    public enum Mode 
    {
        EASY,
        HARD,
    }
    
    public enum Category 
    {
        SPORTS,
        POLITICS,
    }
    
    public abstract class QuoteFactory 
    {
        public QuoteFactory getQuoteFactory(final Mode mode)
        {
            // return either the Hard or Easy QuoteFactory
        }
    
        public abstract Quoute getQuote(Category category)
    }
    
    class HardQuoteFactory
        extends QuoteFactory
    {
        public Quote getQuote(final Category category)  
        {
             // ...
        }
    }
    
    class EasyQuoteFactory
        extends QuoteFactory
    {
        public Quote getQuote(final Category category)  
        {
             // ...
        }
    }
    

    【讨论】:

      【解决方案4】:

      在我看来,您缺少一个重要概念,即 Question 类。这是由 Mode 和 Quote 构成的,可以给出正确的问题并打电话告诉你答案是否正确:

      public class Question
      {
          public Question(Mode mode, Quote quote) { /* store these */ }
      
          public String getQuestion()
          {
              return quote.getQuote() + (mode == Mode.EASY ? quote.getAuthor() : "");
          }
      
          public boolean isCorrect(String answer)
          {
              return quote.getFullQuote().equals(answer);
          }
      }
      

      我的想法是,报价本身在模式之间并没有真正改变,只是将报价的哪些部分呈现给用户。使用这种方法,您可以拥有一个可供任何人在任何地方使用的 Quote 对象存储库。问题负责向用户显示适量的信息,并决定他们是否有正确的响应。

      【讨论】:

      • 我喜欢这个,你可以将“getQuote() + getAuthor()”等实现为抽象工厂。
      • 是的,TofuBeer 做到了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2012-04-08
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多