Abstract Factory模式中将具体的Product封装在具体Factory实现中,而客户仍只要面对Factory与Product的抽象介面,避免依赖于具 体的Factory与Product,由于Factory封装了所必须的Product,所以要更换掉所有的元件,只要简单的抽换掉Factory就可以 了,不用修改客户端的程式。
/** * @author Jerval * @date 2011-4-23 */ public interface IButton { public void drawButton(); } /** * @author Jerval * @date 2011-4-23 */ public interface ILabel { public void drawLabel(); } /** * @author Jerval * @date 2011-4-23 */ public class XpButton implements IButton { @Override public void drawButton() { System.out.println("draw xp button...."); } } /** * @author Jerval * @date 2011-4-23 */ public class XpLabel implements ILabel { @Override public void drawLabel() { System.out.println("draw xp label..."); } } /** * @author Jerval * @date 2011-4-23 */ public class VistaButton implements IButton { @Override public void drawButton() { System.out.println("draw vista button...."); } } /** * @author Jerval * @date 2011-4-23 */ public class VistaLabel implements ILabel { @Override public void drawLabel() { System.out.println("draw vista label..."); } } /** * @author Jerval * @date 2011-4-23 */ public interface IStyleFactory { public IButton getButton(); public ILabel getlILabel(); } /** * @author Jerval * @date 2011-4-23 */ public class XpStyleFactory implements IStyleFactory{ @Override public IButton getButton() { return new XpButton(); } @Override public ILabel getlILabel() { return new XpLabel(); } } /** * @author Jerval * @date 2011-4-23 */ public class VistaStyleFactory implements IStyleFactory{ @Override public IButton getButton() { return new VistaButton(); } @Override public ILabel getlILabel() { return new VistaLabel(); } } /** * @author Jerval * @date 2011-4-23 */ public class CustomMsgBox { private IButton button; private ILabel label; public CustomMsgBox(IStyleFactory styleFactory) { setStyleFactory(styleFactory); } // 客户端依赖于抽象工厂,更换工厂不需要改动客户端 public void setStyleFactory(IStyleFactory styleFactory) { setButton(styleFactory.getButton()); setLabel(styleFactory.getlILabel()); } // 依赖抽象,改变了元件实例客户端代码也不用更改 public void setButton(IButton button) { this.button = button; } public void setLabel(ILabel label) { this.label = label; } public void show() { drawCustomMsgBox(); button.drawButton(); label.drawLabel(); } private void drawCustomMsgBox() { System.out.println("draw CustomMsgBox..."); } } /** * @author Jerval * @date 2011-4-23 */ public class MainClass { public static void main(String[] args) { //show xp style msgBox CustomMsgBox xpStyleMsgBox = new CustomMsgBox(new XpStyleFactory()); xpStyleMsgBox.show(); //show vista style msgBox CustomMsgBox vistaStyleMsgBox = new CustomMsgBox(new VistaStyleFactory()); vistaStyleMsgBox.show(); } }