Это действительный абстрактный шаблон фабричного дизайна? - PullRequest
0 голосов
/ 24 ноября 2011

Я использую вариант абстрактного фабричного шаблона, как определено в http://en.wikipedia.org/wiki/Abstract_factory

Шаблон закодирован в Википедии примерно так -

/* GUIFactory example -- */

interface GUIFactory {
    public Button createButton();
}

class WinFactory implements GUIFactory {
    public WinButton createButton() {
        return new WinButton();
    }
}
class OSXFactory implements GUIFactory {
    public OSXButton createButton() {
        return new OSXButton();
    }
}


interface Button {
    public void paint();
}

class WinButton implements Button {
    public void paint() {
        System.out.println("I'm a WinButton");
    }
}
class OSXButton implements Button {
    public void paint() {
        System.out.println("I'm an OSXButton");
    }
}


class Application {
    public Application(GUIFactory factory) {
        Button button = factory.createButton();
        button.paint();
    }
}

public class ApplicationRunner {
    public static void main(String[] args) {
        new Application(createOsSpecificFactory());
    }

    public static GUIFactory createOsSpecificFactory() {
        int sys = readFromConfigFile("OS_TYPE");
        if (sys == 0) {
            return new WinFactory();
        } else {
            return new OSXFactory();
        }
    }
}

Я использую его немного по-другому, поскольку мне не нужен дополнительный слой абстракции для переопределения поведения рисования в реализациях Button.

Мой код -

    //Implmentation code
                  MainMenuButtonFactory mainMenuButtonFactory = new SyncButtonFactory();
                   BitmapButtonField refreshButton = mainMenuButtonFactory.createButton();    

        public interface MainMenuButtonFactory {

            BitmapButtonField createButton();

        }

        public class SyncButtonFactory implements MainMenuButtonFactory{

            public BitmapButtonField createButton() {

                return new BitmapButtonField(ButtonImageFactory.getResyncBitmap(),
                       ButtonImageFactory.getResyncBitmapHighlight()){
                   public boolean navigationClick(int status, int time)
                    {
                       FutureContent.future.clearContent();
                       ScreenController.displayNextScreen(new UpdatingScreenAnimation(Constants.MAIN_MENU_SCREEN));

                       return super.navigationClick(status, time);
                    }
                };

            }

        }

public class JudgeButtonFactory implements MainMenuButtonFactory{

    public BitmapButtonField createButton() {

        BitmapButtonField judgeButton = new BitmapButtonField(ButtonImageFactory.getJudgeBitmap(), 
                ButtonImageFactory.getJudgeBitmapHighlight()){
       public boolean navigationClick(int status, int time)
          {
        RatingsScreenController ratingsScreenController = new RatingsScreenController("MainMenuScreen");
        Thread t = new Thread(ratingsScreenController);
        t.start();

           return super.navigationClick(status, time);
          }
      };

      return judgeButton;
    }

}

Это все еще действующий абстрактный шаблон фабричного проектирования?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Да, если у вас есть интерфейс для создания объектов и реализации одной реализации, вы реализуете абстрактную фабрику.

Но учтите:

  • понадобится несколько реализаций фабрики?Если это не так, то вам не нужен этот шаблон
  • Собираетесь ли вы использовать фабрику в нескольких местах?Если нет, вам не нужна фабрика (где-то только метод сборки).
1 голос
/ 24 ноября 2011

Возможно, вы просто не показали весь код, чтобы сконцентрироваться на поставленном вами вопросе paint, но я ожидаю увидеть и другие классы XXXButtonFactory implements MainMenuButtonFactory. И это создаст варианты родительского класса / интерфейса BitmapButtonField.

Если у вас нет других или все ваши MainMenuButtonFactory производные классы просто создают BitmapButtonField классы, без изменений, тогда Abstract Factory не выглядит подходящим шаблоном. Сравните это с вариантами Facory, которые затем создают WinButton / OSXButton в примере.

В этом смысле отсутствие метода paint само по себе не является проблемой ... но я бы ожидал увидеть свидетельства некоторой вариации в создаваемых классах. Если не paint, то какой вариант вы моделируете, который оправдывает использование абстрактной фабрики?

...