前面我们已经介绍了简单工厂和工厂方法模式,我们先简单回顾一下
简单工厂模式
工厂方法模式
介绍
抽象工厂模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它引入了多个工厂接口,每个工厂接口负责创建一类产品。
组成部分
结构图
场景
假设我们要创建一个跨平台的UI控件库,包括按钮和文本框,有两种不同的风格:Windows风格和Mac风格。
代码
// 抽象产品:按钮
interface Button {
void render();
}
// 抽象产品:文本框
interface TextBox {
void display();
}
// 具体产品1:Windows风格按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Render Windows Button");
}
}
// 具体产品2:Mac风格按钮
class MacButton implements Button {
@Override
public void render() {
System.out.println("Render Mac Button");
}
}
// 具体产品3:Windows风格文本框
class WindowsTextBox implements TextBox {
@Override
public void display() {
System.out.println("Display Windows TextBox");
}
}
// 具体产品4:Mac风格文本框
class MacTextBox implements TextBox {
@Override
public void display() {
System.out.println("Display Mac TextBox");
}
}
// 抽象工厂:UI控件工厂
interface UIControlFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂1:Windows风格工厂
class WindowsUIControlFactory implements UIControlFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// 具体工厂2:Mac风格工厂
class MacUIControlFactory implements UIControlFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextBox createTextBox() {
return new MacTextBox();
}
}
// 客户端
public class AbstractFactoryPatternExample {
public static void main(String[] args) {
// 创建Windows风格UI控件
UIControlFactory windowsFactory = new WindowsUIControlFactory();
Button windowsButton = windowsFactory.createButton();
TextBox windowsTextBox = windowsFactory.createTextBox();
windowsButton.render();
windowsTextBox.display();
// 创建Mac风格UI控件
UIControlFactory macFactory = new MacUIControlFactory();
Button macButton = macFactory.createButton();
TextBox macTextBox = macFactory.createTextBox();
macButton.render();
macTextBox.display();
}
}
在这个例子中,UIControlFactory 是抽象工厂接口,定义了创建按钮和文本框的方法。WindowsUIControlFactory 和 MacUIControlFactory 是具体工厂,分别实现了Windows和Mac风格的UI控件。每个具体工厂对应一个产品族,即按钮和文本框的组合。客户端可以选择使用不同的工厂来创建不同风格的UI控件。这样,当需要增加新的UI控件时,只需要添加新的产品和工厂,而不需要修改现有的代码,符合开闭原则。
我们再来总结一下工厂方法模式和抽象工厂模式的区别: