4

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

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

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

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

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

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

硬模式不会让作者让用户更难猜出报价的其余部分。另外,这不是学校作业。我一直在阅读 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);
}
4

4 回答 4

2

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

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

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

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

于 2009-03-28T21:37:56.580 回答
2

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

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

于 2009-03-28T21:52:38.383 回答
1

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

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 对象存储库。问题负责向用户显示适量的信息,并决定他们是否有正确的回应。

于 2009-03-28T21:54:20.550 回答
1

没有太多的思考,并试图保持你的设计,这样的事情怎么样(我假设 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)  
    {
         // ...
    }
}
于 2009-03-28T21:58:22.693 回答