1.概念
工厂方法模式只能生产一个产品系列,抽象工厂可以生产多个产品系列
2.作用
多个具体产品组成一个产品族(产品系列),一个具体工厂负责生产一个产品族
3.应用场景
系统所需产品间由依赖关系,可以划分为同一产品族时
需要动态的切换产品族
4.特点
- 分离接口和实现:客户端通过抽象接口与具体实现分离,从而降低了客户端与具体产品类之间的耦合。
- 封装产品族:抽象工厂模式不仅封装了单个产品的创建,还封装了产品族(即一组相关或相互依赖的产品)的创建。
- 易于切换产品族:由于客户端是通过抽象接口与产品族交互的,因此可以轻松地在不同的产品族之间进行切换,而无需修改客户端代码。
- 支持扩展:新增产品族时,只需新增相应的具体工厂类和产品类,无需修改现有代码,符合开闭原则
5.类与对象关系
6.实现
// 抽象产品接口:按钮
interface Button {
void render();
}
// 抽象产品接口:文本框
interface TextField {
void display();
}
// 具体产品类:Windows风格的按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Windows-style button.");
}
}
// 具体产品类:Windows风格的文本框
class WindowsTextField implements TextField {
@Override
public void display() {
System.out.println("Displaying a Windows-style text field.");
}
}
// 具体产品类:Mac风格的按钮
class MacButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Mac-style button.");
}
}
// 具体产品类:Mac风格的文本框
class MacTextField implements TextField {
@Override
public void display() {
System.out.println("Displaying a Mac-style text field.");
}
}
// 抽象工厂接口
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂类:Windows工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// 具体工厂类:Mac工厂
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
// 客户端代码
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
// 使用Windows工厂创建Windows风格的GUI组件
GUIFactory windowsFactory = new WindowsFactory();
Button windowsButton = windowsFactory.createButton();
TextField windowsTextField = windowsFactory.createTextField();
windowsButton.render();
windowsTextField.display();
// 使用Mac工厂创建Mac风格的GUI组件
GUIFactory macFactory = new MacFactory();
Button macButton = macFactory.createButton();
TextField macTextField = macFactory.createTextField();
macButton.render();
macTextField.display();
}
}