提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
理解抽象工厂模式:为一族相关对象提供统一创建接口
掌握工厂族(MacOS、Windows)与其产品(Button、Checkbox)的对应关系
理解抽象工厂如何保证同一工厂产出的产品风格一致性
了解抽象工厂与工厂方法的区别,以及各自的适用场景
抽象工厂创建一组相互兼容的产品,客户端仅依赖抽象接口
/** 抽象工厂接口:为一族相关产品声明创建方法 */
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}/** MacOS 风格工厂:同时生产 MacOSButton + MacOSCheckbox */
public class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}/** Windows 风格工厂:同时生产 WindowsButton + WindowsCheckbox */
public class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}/** 产品接口:所有按钮实现此接口 */
public interface Button {
void render();
void onClick();
}/** 产品接口:所有复选框实现此接口 */
public interface Checkbox {
void render();
void toggle();
}class MacOSButton implements Button {
public void render() { System.out.println("MacOSButton rendered"); }
public void onClick() {}
}
class MacOSCheckbox implements Checkbox {
public void render() { System.out.println("MacOSCheckbox rendered"); }
public void toggle() {}
}
class WindowsButton implements Button {
public void render() { System.out.println("WindowsButton rendered"); }
public void onClick() {}
}
class WindowsCheckbox implements Checkbox {
public void render() { System.out.println("WindowsCheckbox rendered"); }
public void toggle() {}
}public class Demo {
private static GUIFactory factory;
public static void main(String[] args) {
configure();
renderUI();
}
/** 根据配置选择具体工厂 */
static void configure() {
String os = System.getProperty("os.name");
if (os.contains("Mac")) {
factory = new MacOSFactory();
} else {
factory = new WindowsFactory();
}
}
/** 客户端只认识抽象接口,同一工厂产出风格一致的产品 */
static void renderUI() {
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();
button.render();
checkbox.render();
}
}一个工厂同时负责一族(多个相关)产品的创建,而非单一产品的不同变体。
MacOSButton + MacOSCheckbox 必须由 MacOSFactory 同一工厂产出,保证跨平台风格一致。
新增产品族(如 LinuxFactory + LinuxButton + LinuxCheckbox)无需修改已有代码,只需添加新类。
如:跨平台 UI(每个平台有一套 Button + Checkbox + TextField)、数据库驱动(MySQL + PostgreSQL 各有一套 Connection + Statement)。