概述
抽象工厂模式是一种创建型设计模式,它允许用户创建一系列相关的对象,而无需指定其具体类。这种模式提供了一种将一组相关或相互依赖的对象封装在一起的方法,以便它们可以作为一个整体进行使用,并且可以轻松地交换整个产品系列。
目的
分离接口与实现:客户代码通过抽象接口操作对象,而不需要了解具体的实现细节。
系列产品的统一管理:对于具有多个产品线或者不同变体的产品族,抽象工厂模式能够以统一的方式创建这些系列的产品。
易于扩展和维护:增加新的产品族或产品时,只需添加新的具体工厂和产品类,而不影响现有代码。
角色
抽象工厂(Abstract Factory):声明创建一系列产品对象的接口。
具体工厂(Concrete Factory):实现抽象工厂接口,负责创建一个产品系列的具体对象。
抽象产品(Abstract Product):定义产品对象的接口,声明一组相关产品的接口。
具体产品(Concrete Product):实现抽象产品接口的具体类,每个具体产品对应一个产品族。
示例
场景
假设我们正在开发一个软件,该软件需要根据用户的操作系统(Windows、Mac)提供不同的按钮和文本框样式。
类图
抽象工厂: GUIFactory
具体工厂: WinFactory, MacFactory
抽象产品: Button, TextField
具体产品: WinButton, MacButton, WinTextField, MacTextField
代码示例
// 抽象产品:按钮接口
interface Button {
void paint();
}
// 具体产品:Windows按钮
class WinButton implements Button {
public void paint() {
System.out.println("Painting a Windows button.");
}
}
// 具体产品:Mac按钮
class MacButton implements Button {
public void paint() {
System.out.println("Painting a Mac button.");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂:Windows工厂
class WinFactory implements GUIFactory {
public Button createButton() {
return new WinButton();
}
public TextField createTextField() {
return new WinTextField();
}
}
// 具体工厂:Mac工厂
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public TextField createTextField() {
return new MacTextField();
}
}
// 客户端代码
public class Client {
public static void main(String[ ] args) {
// 根据操作系统选择工厂
GUIFactory factory;
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
factory = new WinFactory();
} else if (os.contains("mac")) {
factory = new MacFactory();
} else {
throw new UnsupportedOperationException("Unsupported OS");
}
// 创建并使用产品
Button button = factory.createButton();
button.paint();
}
}
应用场景
当系统需要独立于产品的创建、组合和表示时。
当一个系统要独立于它的产品的创建、组合和表示时。
当要强调一系列相关产品的接口一致,而不要求关心这个产品的具体实现时。
优点
提高了代码的可扩展性,当需要添加新的产品族时,只需要添加相应的新工厂类和产品类即可。
使得代码结构更加清晰,减少了客户代码与具体产品之间的耦合。
缺点
随着产品族和产品的增加,类的数量会急剧增加,增加了系统的复杂度。
过多的抽象层次可能会使代码结构变得晦涩难懂。
抽象工厂模式是一种强大的设计工具,适用于构建复杂的、可扩展的系统,特别是在处理多个产品系列时。正确应用此模式,可以显著提高软件的灵活性和可维护性。
评论区