Связывание двух абстрактных фабричных шаблонов в Java - PullRequest
4 голосов
/ 29 марта 2009

Я пишу программу сопоставления цитат, в которой требуются два абстрактных фабричных шаблона, это два интерфейса; QuoteFactory и ModeFactory . ModeFactory переключается между EasyMode и HardMode , а QuoteFactory выбирает кавычки между несколькими различными предметами (например, PolitQuotes , SportsQuotes ). Короче говоря, пользователь выберет режим, если выбран EasyMode, то пользователь должен угадать цитату, тогда как если пользователь выбирает HardMode, ему говорят, кто произнес цитату, а затем нужно угадать, поэтому реализация цитат будет меняться в зависимости от режима и выбранных кавычек.

До сих пор я создал ModeFactory в качестве интерфейса и внедрил его в EasyMode и HardMode, но теперь мне нужно каким-то образом интегрировать другой шаблон абстрактной фабрики (или более) в эти режимы, чтобы можно было выбирать кавычки. Если это полезно, я также создал класс Quote, в котором определены мои Quotes.

Может кто-нибудь помочь мне придумать базовую реализацию этих абстрактных фабрик? Это краткое изложение того, что я имею до сих пор, хотя я не могу не чувствовать, что каким-то образом это слишком усложнило ...

РЕДАКТИРОВАТЬ: Для уточнения того, что я имею в виду: если пользователь выбирает простой режим, ему предоставляется начало цитаты И автор этой цитаты, тогда как если он выбирает жесткий режим, ему предоставляется только начало цитата. Например

Простой режим: «Я чувствовал силу ...» Жозе Моуринью

Жесткий режим: «Я почувствовал силу ...»

Жесткий режим не позволяет автору усложнить угадывание остальной части цитаты. Кроме того, это не школьное задание. Я читал Head First Design Patterns и теперь я пытаюсь применить полученные знания в различных ситуациях (вместо их примера с Pizza я работаю над игрой «Угадай цитаты» после прочтения QI (британского телешоу). ) книга.

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

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

Ответы [ 4 ]

2 голосов
/ 29 марта 2009

Вы, вероятно, закончите проектировать здесь. Прежде всего, вам нужен класс Quote. Это должно включать в себя цитату и иметь соответствующие средства доступа (геттеры) как для простого, так и для жесткого режима. Тогда вам нужна коллекция цитат. Если они сохраняются в базе данных, вы можете легко выбрать тип цитаты.

Я также считаю, что ModeFactory не нужен. Зачем вам нужен интерфейс, чтобы просто выбирать между двумя режимами? Государственный флаг проще.

2 голосов
/ 29 марта 2009

Можете ли вы сделать один шаг назад и повторить то, что вы пытаетесь сделать? Иногда я обнаруживаю, что, пытаясь объяснить проблему кому-то, кто не знаком с ней, решение оказывается мне органичным.

Из вашего описания кажется, что вы начали с частичного решения («Я хочу использовать шаблон абстрактной фабрики»), а не с того, что вы действительно хотите сделать (например, «Я хочу предоставить цитату»). класс, который доставляет разные цитаты в зависимости от вкуса (политический, спортивный) и модного (легкий, жесткий) ").

Мне кажется, что enum, а не фабрика. Есть перечисление для {политические, спортивные} и отдельное для режима.

РЕДАКТИРОВАТЬ : если подумать еще раз, возможно, это школьное задание («Использовать абстрактный шаблон фабрики для… бла-бла-бла»), и именно по этой причине вы начали полу-решение.

1 голос
/ 29 марта 2009

Не слишком задумываясь и пытаясь придерживаться своего дизайна, как насчет чего-то вроде этого (я предполагаю, что класс 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)  
    {
         // ...
    }
}
1 голос
/ 29 марта 2009

Мне кажется, что вам не хватает важной концепции, класса Вопросов. Это построено как с Модой, так и с Цитатой, может выдать правильный вопрос и позвонить и сказать вам, если ответ правильный:

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, который может использоваться кем угодно. Вопрос отвечает за отображение правильного количества информации для пользователя и принятие решения о том, имеют ли они правильный ответ.

...