2011-11-24 105 views
0

我使用作爲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(); 
     } 
    } 
} 

我在我dont't使用它略有不同需要進一步的抽象層來重寫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

是的,我有MainMenuButtonFactory的多個實現,但這些實現只是從一個類中調用。 –

+0

抽象工廠的顯着特點是方法產生兼容對象。在你的例子中:Windows風格的按鈕帶有Windows風格的組合框。並且使用這種模式,您不會錯誤 –

1

也許你只是沒有顯示出所有的代碼專注於你所構成的paint問題,但我希望看到其他XXXButtonFactory implements MainMenuButtonFactory類了。這些將創建BitmapButtonField的父類/接口的變體。

如果您沒有任何其他人或所有MainMenuButtonFactory派生類只創建BitmapButtonField類,沒有變化,那麼抽象工廠似乎不是合適的模式。將此與在此示例中創建WinButton/OSXButton的Facory變體進行比較。

從這個意義上說,缺少一個paint方法本身並不是一個問題......但我期望看到創建的類中有一些變化的證據。如果不是paint,那麼您建模的哪種變體證明了使用抽象工廠的合理性?

+0

發生的變化是行 - ScreenController.displayNextScreen(new UpdatingScreenAnimation(Constants.MAIN_MENU_SCREEN)); –