这是一个有效的抽象工厂设计模式吗?

时间:2011-11-24 12:58:24

标签: design-patterns

我正在使用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 个答案:

答案 0 :(得分:2)

是的,只要你有一个界面来创建一种对象并提供一个实现,你就是在实现一个抽象工厂。

但请考虑一下:

  • 您是否需要多次实施工厂?如果你不是,那么你不需要这种模式
  • 您打算在多个地方使用工厂吗?如果你不是,你不需要工厂(只是某处的构建方法)。

答案 1 :(得分:1)

也许您还没有显示所有代码专注于您提出的paint问题,但我也希望看到其他XXXButtonFactory implements MainMenuButtonFactory类。这些将创建BitmapButtonField的父类/接口的变体。

如果您没有任何其他人,或者您的所有MainMenuButtonFactory派生类只创建BitmapButtonField类,没有变化,那么抽象工厂似乎不是合适的模式。将此与Facory变体进行比较,然后在示例中创建WinButton / OSXButton

从这个意义上讲,缺少paint方法本身并不是问题......但我希望看到创建的类中存在某些变化的证据。如果不是paint,那么您建模的哪种变体证明了使用抽象工厂的合理性?