Abstract Factory概述
玩具代码案例 - GUI控件工厂
抽象工厂父类角色
IGUIFactory
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;public interface IGUIFactory {IButton createButton();ICheckbox createCheckbox();IRadio createRadio();}
抽象产品组父类角色
IButton
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;public interface IButton {void paint();}
ICheckbox
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;public interface ICheckbox {void paint();}
IRadio
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;public interface IRadio {void paint();}
抽象工厂子类角色&抽象产品组子类角色 - MacOSGUIFactory
MacOSGUIFactory
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;public class MacOSGUIFactory implements IGUIFactory {@Overridepublic IButton createButton() {return new MacOSButton();}@Overridepublic ICheckbox createCheckbox() {return new MacOSCheckbox();}@Overridepublic IRadio createRadio() {return new MacOSRadio();}}
MacOSButton
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;public class MacOSButton implements IButton {@Overridepublic void paint() {System.out.println("You have created MacOSButton.");}}
MacOSCheckbox
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;public class MacOSCheckbox implements ICheckbox {@Overridepublic void paint() {System.out.println("You have created MacOSCheckbox.");}}
MacOSRadio
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;public class MacOSRadio implements IRadio {@Overridepublic void paint() {System.out.println("You have created MacOSRadio.");}}
抽象工厂子类角色&抽象产品组子类角色 - WindowsGUIFactory
WindowsGUIFactory
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;public class WindowsGUIFactory implements IGUIFactory {@Overridepublic IButton createButton() {return new WindowsButton();}@Overridepublic ICheckbox createCheckbox() {return new WindowsCheckbox();}@Overridepublic IRadio createRadio() {return new WindowsRadio();}}
WindowsButton
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;public class WindowsButton implements IButton {@Overridepublic void paint() {System.out.println("You have created WindowsButton.");}}
WindowsCheckbox
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;public class WindowsCheckbox implements ICheckbox {@Overridepublic void paint() {System.out.println("You have created WindowsCheckbox.");}}
WindowsRadio
package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;public class WindowsRadio implements IRadio {@Overridepublic void paint() {System.out.println("You have created WindowsRadio.");}}
不基于抽象工厂模式的实现
创建产品的代码散布在系统的各个角落,一旦需要替换这组产品需要在各处修改代码
OS
package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.bad;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSButton;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSCheckbox;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsButton;import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsCheckbox;public class OS {private String osName;public String getOsName() {return osName;}public void setOsName(String osName) {this.osName = osName;}public void drawDesktop(){if(osName.equals("windows")) {new WindowsButton().paint();new WindowsCheckbox().paint();}else{new MacOSButton().paint();new MacOSCheckbox().paint();}}public void drawToolbar(){if(osName.equals("windows")) {new WindowsButton().paint();new WindowsCheckbox().paint();}else{new MacOSButton().paint();new MacOSCheckbox().paint();}}public void drawBrowser(){if(osName.equals("windows")) {new WindowsButton().paint();new WindowsCheckbox().paint();}else{new MacOSButton().paint();new MacOSCheckbox().paint();}}}
Main
package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.bad;public class Main {public static void main(String[] args) {String osName = System.getProperty("os.name").toLowerCase();// osOS os = new OS();os.setOsName(osName);// do businessos.drawDesktop();os.drawToolbar();os.drawBrowser();}}
Console
You have created MacOSButton.You have created MacOSCheckbox.You have created MacOSButton.You have created MacOSCheckbox.You have created MacOSButton.You have created MacOSCheckbox.
基于抽象工厂模式的实现
系统面向抽象的产品组件工作,一旦需要替换这组产品仅仅需要替换一个抽象工厂的实现即可
OS
package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.good;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;
public class OS {
private IGUIFactory guiFactory;
public IGUIFactory getGuiFactory() {
return guiFactory;
}
public void setGuiFactory(IGUIFactory guiFactory) {
this.guiFactory = guiFactory;
}
public void drawDesktop(){
getGuiFactory().createButton().paint();
getGuiFactory().createCheckbox().paint();
}
public void drawToolbar(){
getGuiFactory().createButton().paint();
getGuiFactory().createCheckbox().paint();
}
public void drawBrowser(){
getGuiFactory().createButton().paint();
getGuiFactory().createCheckbox().paint();
}
}
Main
package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.good;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSGUIFactory;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsGUIFactory;
public class Main {
public static void main(String[] args) {
// business
String osName = System.getProperty("os.name").toLowerCase();
// abstract factory
IGUIFactory guiFactory;
if (osName.contains("mac")) {
guiFactory = new MacOSGUIFactory();
} else {
guiFactory = new WindowsGUIFactory();
}
// os -> gui factory
OS os = new OS();
os.setGuiFactory(guiFactory);
// do business
os.drawDesktop();
os.drawToolbar();
os.drawBrowser();
}
}
Console
You have created MacOSButton.
You have created MacOSCheckbox.
You have created MacOSButton.
You have created MacOSCheckbox.
You have created MacOSButton.
You have created MacOSCheckbox.
UML


