我正在使用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;
}
}
这仍然是一个有效的抽象工厂设计模式吗?
答案 0 :(得分:2)
是的,只要你有一个界面来创建一种对象并提供一个实现,你就是在实现一个抽象工厂。
但请考虑一下:
答案 1 :(得分:1)
也许您还没有显示所有代码专注于您提出的paint
问题,但我也希望看到其他XXXButtonFactory implements MainMenuButtonFactory
类。这些将创建BitmapButtonField
的父类/接口的变体。
如果您没有任何其他人,或者您的所有MainMenuButtonFactory
派生类只创建BitmapButtonField
类,没有变化,那么抽象工厂似乎不是合适的模式。将此与Facory变体进行比较,然后在示例中创建WinButton
/ OSXButton
。
从这个意义上讲,缺少paint
方法本身并不是问题......但我希望看到创建的类中存在某些变化的证据。如果不是paint
,那么您建模的哪种变体证明了使用抽象工厂的合理性?