抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种创建型设计模式,它能够创建一系列相关或依赖的对象,而无需指定它们的具体类。抽象工厂模式通过提供一个接口来创建多个产品族中的对象,从而确保这些对象是相互兼容的。
模式结构
- 抽象产品(Abstract Product)
定义产品族的接口,声明产品的方法。 - 具体产品(Concrete Product)
实现抽象产品接口,表示具体的产品对象。 - 抽象工厂(Abstract Factory)
定义创建产品族中各个对象的接口。 - 具体工厂(Concrete Factory)
实现抽象工厂的接口,创建具体产品族的对象。
代码示例
1. 抽象产品(Abstract Product)
// 抽象产品A:交换机接口
interface Exchange {
void company();
}
// 抽象产品B:路由器接口
interface Router {
void company();
}
2. 具体产品(Concrete Product)
// 具体产品A1:华为交换机
class HuaWeiExchange implements Exchange {
@Override
public void company() {
System.out.println("华为交换机");
}
}
// 具体产品A2:华三交换机
class H3CExchange implements Exchange {
@Override
public void company() {
System.out.println("华三交换机");
}
}
// 具体产品B1:华为路由器
class HuaWeiRouter implements Router {
@Override
public void company() {
System.out.println("华为路由器");
}
}
// 具体产品B2:华三路由器
class H3CRouter implements Router {
@Override
public void company() {
System.out.println("华三路由器");
}
}
3. 抽象工厂(Abstract Factory)
// 抽象工厂:定义创建交换机与路由器的方法
interface NetworkDeviceFactory {
Exchange createExchange();
Router createRouter();
}
4. 具体工厂(Concrete Factory)
// 具体工厂1:华为工厂
class HuaWeiFactory implements NetworkDeviceFactory {
@Override
public Exchange createExchange() {
return new HuaWeiExchange();
}
@Override
public Router createRouter() {
return new HuaWeiRouter();
}
}
// 具体工厂2:华三工厂
class H3CFactory implements NetworkDeviceFactory {
@Override
public Exchange createExchange() {
return new H3CExchange();
}
@Override
public Router createRouter() {
return new H3CRouter();
}
}
5.调用示例
public class AbstractFactoryPattern {
public static void main(String[] args) {
// 随机选择工厂
NetworkDeviceFactory factory;
List<String> companys = new ArrayList<>();
companys.add("huawei");
companys.add("h3c");
Collections.shuffle(companys);
if ("huawei".equals(companys.get(0))) {
factory = new HuaWeiFactory();
} else {
factory = new H3CFactory();
}
// 使用工厂创建产品
factory.createExchange().company();
factory.createRouter().company();
}
}
应用场景
- 产品族的需求
当系统需要创建一系列相关或依赖的对象时,可以使用抽象工厂模式。例如,创建不同品牌的电子设备(如手机、耳机、充电器)。 - 跨平台兼容性
当系统需要支持多个平台(如Windows、macOS、Linux)时,可以使用抽象工厂模式来创建与平台兼容的对象。 - 避免客户端与具体类耦合
当客户端代码需要与多个产品族交互,但不需要知道具体类时,可以使用抽象工厂模式。
在Java中的应用
- Java GUI库(Swing/AWT)
javax.swing
包中的LookAndFeel
类是一个抽象工厂,它定义了创建按钮、文本框等UI组件的方法。不同的LookAndFeel
实现(如MetalLookAndFeel
、WindowsLookAndFeel
)创建不同风格的UI组件。 - JDBC
java.sql.Connection
接口可以看作是一个抽象工厂,它定义了创建Statement
、PreparedStatement
等对象的方法。不同的数据库驱动(如MySQL、PostgreSQL)提供了具体的实现。
优缺点
优点
- 产品族的一致性
抽象工厂模式确保同一工厂创建的产品是相互兼容的。 - 解耦
客户端代码与具体产品的实现解耦,只需依赖抽象接口。 - 开闭原则
添加新的产品族时,只需添加新的具体工厂和产品类,无需修改现有代码。
缺点
- 复杂性增加
每增加一个产品族,都需要增加新的抽象产品和具体产品类,可能导致类数量过多。 - 扩展困难
如果需要添加新的产品类型(如新增一个产品C),则需要修改抽象工厂及其所有具体工厂类,违反了开闭原则。
总结
抽象工厂模式通过提供一个接口来创建一系列相关或依赖的对象,确保这些对象是相互兼容的。它适用于需要创建产品族的场景,尤其是在跨平台兼容性和产品一致性方面。尽管它可能会导致类数量增加和扩展困难,但其优点在于提高了代码的可维护性和灵活性。在Java中,抽象工厂模式广泛应用于GUI库和JDBC等场景。