有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

有人能帮我想出这些抽象工厂的基本实现吗?这是我到目前为止所拥有的东西的概要,尽管我忍不住觉得我以某种方式把它复杂化了

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

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

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

硬模式不允许作者让用户更难猜测引用的其余部分。而且,这不是学校的作业。我一直在阅读Head First设计模式,现在我正在尝试将我学到的知识应用到不同的情况中(而不是他们的披萨示例),在阅读了QI(英国电视节目)一书之后,我正在做一个猜测报价的游戏

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

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

共 (2) 个答案

  1. # 1 楼答案

    你能后退一步,重申你想做什么吗?我有时会发现,通过向不熟悉挑战的人解释挑战,解决方案在某种程度上有机地浮现在我面前

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

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

    编辑:再想一想,可能是学校作业(“使用抽象工厂模式来……诸如此类”),这就是为什么你从一个半解决方案开始

  2. # 2 楼答案

    不需要太多思考,也不需要尝试按照您的设计,这样的事情怎么样(我假设Quote类有getText()和getAuthor方法,您可能还想让它成为getText(int numberOfWords),这样您就可以配置要给出多少Quote):

    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)  
        {
             // ...
        }
    }