代码之家  ›  专栏  ›  技术社区  ›  Mike B

在Java中链接两个抽象工厂模式

  •  4
  • Mike B  · 技术社区  · 15 年前

    我正在编写一个报价匹配程序,其中需要两个抽象工厂模式,这是两个接口; 模型工厂 易模 硬模式 QuoteFactory在几个不同的主题(即。 政治语录 , 体育名言 )简言之,用户将选择一种模式,如果选择EasyMode,则用户必须猜测报价,而如果用户选择HardMode,则用户将被告知谁说了报价,然后必须猜测,因此报价的实现将根据模式以及所选报价而变化。

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

    编辑:对我的意思进行重新分类:如果用户选择简单模式,则会向他们提供报价的开头和作者,而如果用户选择硬模式,则只会向他们提供报价的开头。例如

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

    硬模式: “我感觉到了……的力量。”

    public interface ModeFactory {
        public Mode retrieveMode(String s); 
    }
    
    public interface QuoteFactory {
        public Quote retrieveQuote(String s);
    }
    
    4 回复  |  直到 15 年前
        1
  •  2
  •   Cheeso    15 年前

    你能后退一步,重申你想做什么吗?我有时会发现,通过努力向不熟悉挑战的人解释挑战,我会自然而然地找到解决方案。

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

    编辑

        2
  •  2
  •   kgiannakakis    15 年前

    你可能在这里设计过度了。您首先需要的是报价类。这应该封装报价,并且应该有适当的访问器(getter),用于Easy和Hard模式。然后你需要一组引号。如果这些都保存在数据库中,您可以轻松地选择报价的类型。

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

        3
  •  1
  •   TofuBeer    15 年前

    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
  •  1
  •   Tim Frey    15 年前

    在我看来,你错过了一个重要的概念,一个问题课。这是由模式和报价构成的,可以给出正确的问题并打电话告诉您答案是否正确:

    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对象存储库,任何人都可以在任何地方使用它。问题负责向用户显示正确数量的信息,并决定他们是否有正确的响应。