抽象工厂
一、解决的问题
抽象工厂模式主要解决了在具有多个产品族的情况下,如何统一管理创建相关产品对象的问题。
当系统需要创建一系列相互关联或相互依赖的对象,并且这些对象可以形成多个不同的产品族时,如果直接由客户端去分别创建这些对象,会导致客户端与具体的产品类紧密耦合,并且当需要切换产品族时,修改的成本会很高。
例如,一个图形用户界面(GUI)应用可能需要为不同的操作系统(如 Windows、Mac、Linux)创建各自风格的按钮、文本框等组件。如果没有抽象工厂模式,客户端代码需要了解每个具体操作系统的组件实现细节,并且在需要切换操作系统支持时,大量的代码都需要修改。
二、好处
- 解耦了客户端与具体产品类
客户端只需要与抽象工厂和抽象产品交互,无需关心具体产品对象的创建细节和具体类,降低了客户端与具体产品类之间的耦合度。
- 便于产品族切换
通过切换使用不同的具体工厂,可以轻松地在不同的产品族之间进行切换,而无需修改客户端的调用代码。
- 统一的产品创建逻辑
将创建相关产品对象的逻辑集中在工厂类中,便于对产品的创建进行统一管理和维护。
三、坏处
- 扩展新的产品族困难
当需要增加一个新的产品族时,需要修改抽象工厂接口以及所有的具体工厂实现类,违背了“开闭原则”(对扩展开放,对修改关闭),可能会影响到已有的代码。
- 代码结构复杂
抽象工厂模式增加了系统中类的数量和层次结构,使得代码结构相对复杂,对于简单的应用场景,可能会导致过度设计。
一、抽象工厂模式介绍
抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式的主要优点是:易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易;它让具体的创建实例过程与客户端分离,客户端是通过抽象工厂和抽象产品来操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
抽象工厂模式的缺点是:如果要增加新的产品系列,需要修改抽象工厂和所有的具体工厂类,这违背了“开闭原则”。
二、Java 代码示例
以下是一个使用 Java 实现的抽象工厂模式的示例,假设我们有两个产品系列:Windows
系列的窗口组件(按钮和文本框)和 Mac
系列的窗口组件:
// 按钮接口
interface Button {
void paint();
}
// Windows 风格的按钮
class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("Painting Windows Button");
}
}
// Mac 风格的按钮
class MacButton implements Button {
@Override
public void paint() {
System.out.println("Painting Mac Button");
}
}
// 文本框接口
interface TextBox {
void show();
}
// Windows 风格的文本框
class WindowsTextBox implements TextBox {
@Override
public void show() {
System.out.println("Showing Windows TextBox");
}
}
// Mac 风格的文本框
class MacTextBox implements TextBox {
@Override
public void show() {
System.out.println("Showing Mac TextBox");
}
}
// 抽象工厂接口
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// Windows 风格的工厂,用于创建 Windows 风格的组件
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// Mac 风格的工厂,用于创建 Mac 风格的组件
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextBox createTextBox() {
return new MacTextBox();
}
}
// 客户端代码
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
GUIFactory factory;
// 创建 Windows 风格的工厂
factory = new WindowsFactory();
Button windowsButton = factory.createButton();
TextBox windowsTextBox = factory.createTextBox();
windowsButton.paint();
windowsTextBox.show();
// 创建 Mac 风格的工厂
factory = new MacFactory();
Button macButton = factory.createButton();
TextBox macTextBox = factory.createTextBox();
macButton.paint();
macTextBox.show();
}
}