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 {
@Override
public IButton createButton() {
return new MacOSButton();
}
@Override
public ICheckbox createCheckbox() {
return new MacOSCheckbox();
}
@Override
public 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 {
@Override
public 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 {
@Override
public 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 {
@Override
public 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 {
@Override
public IButton createButton() {
return new WindowsButton();
}
@Override
public ICheckbox createCheckbox() {
return new WindowsCheckbox();
}
@Override
public 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 {
@Override
public 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 {
@Override
public 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 {
@Override
public 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();
// os
OS os = new OS();
os.setOsName(osName);
// 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.
基于抽象工厂模式的实现
系统面向抽象的产品组件工作,一旦需要替换这组产品仅仅需要替换一个抽象工厂的实现即可
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.