抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。抽象工厂模式通过定义抽象工厂接口和一组抽象产品接口,使得客户端可以通过抽象接口来创建一系列相关的产品对象,从而实现了对象的创建过程与使用过程的解耦。
在抽象工厂模式中,有四个主要角色:
- 抽象产品(Abstract Product):定义了产品对象的接口。
- 具体产品(Concrete Product):实现了抽象产品接口的具体类。
- 抽象工厂(Abstract Factory):定义了创建产品对象的抽象方法。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品的实例。
代码实现
// 抽象产品接口A
interface AbstractProductA {
void operationA();
}
// 具体产品A1
class ConcreteProductA1 implements AbstractProductA {
@Override
public void operationA() {
System.out.println("具体产品A1的操作");
}
}
// 具体产品A2
class ConcreteProductA2 implements AbstractProductA {
@Override
public void operationA() {
System.out.println("具体产品A2的操作");
}
}
// 抽象产品接口B
interface AbstractProductB {
void operationB();
}
// 具体产品B1
class ConcreteProductB1 implements AbstractProductB {
@Override
public void operationB() {
System.out.println("具体产品B1的操作");
}
}
// 具体产品B2
class ConcreteProductB2 implements AbstractProductB {
@Override
public void operationB() {
System.out.println("具体产品B2的操作");
}
}
// 抽象工厂接口
interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
// 示例用法
public class Main {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
AbstractProductA productA1 = factory1.createProductA();
AbstractProductB productB1 = factory1.createProductB();
productA1.operationA(); // 输出:具体产品A1的操作
productB1.operationB(); // 输出:具体产品B1的操作
AbstractFactory factory2 = new ConcreteFactory2();
AbstractProductA productA2 = factory2.createProductA();
AbstractProductB productB2 = factory2.createProductB();
productA2.operationA(); // 输出:具体产品A2的操作
productB2.operationB(); // 输出:具体产品B2的操作
}
}
以上是抽象工厂模式的实现示例,通过抽象工厂接口和具体工厂类来创建一系列相关产品的实例。每个具体工厂类负责创建对应的具体产品类的实例,实现了对象的创建与使用的解耦。
总结
抽象工厂模式的优点包括:
- 降低了代码的耦合性:客户端只需要依赖于抽象工厂和抽象产品接口,无需关心具体产品的实现细节。
- 提供了一种产品族的创建方式:抽象工厂模式可以创建一系列相关的产品对象,保证了这些产品对象的兼容性。
- 符合开闭原则:对扩展开放,对修改关闭。
抽象工厂模式的缺点包括:
- 增加了系统的复杂度:引入了新的抽象工厂接口和具体工厂类,增加了系统的抽象性和理解难度。
- 每增加一个产品族,就需要创建对应的抽象产品类和具体产品类,增加了系统的代码量。
总结来说,抽象工厂模式适用于需要创建一系列相关或相互依赖对象的场景,它提供了一种统一的对象创建方式,并且保证了创建的产品对象的兼容性。
抽象工厂模式和工厂方法模式的区别
抽象工厂模式和工厂方法模式的主要区别在于抽象程度和对象创建的范围。
- 抽象程度:
- 抽象工厂模式:它提供了一个接口来创建一系列相关或相互依赖的对象,而不需要指定它们的具体类。客户端代码与抽象工厂和抽象产品接口进行交互。
- 工厂方法模式:它提供了一个接口来创建对象,但负责对象创建的具体类是从基类派生或实现接口的。客户端代码与工厂接口和具体产品类进行交互。
- 对象创建的范围:
- 抽象工厂模式:它专注于创建一系列相关的对象。抽象工厂定义了创建产品系列中每个产品的方法,每个具体工厂类实现这些方法来创建具体产品。
- 工厂方法模式:它专注于创建单个对象。工厂方法负责创建对象,子类通过重写工厂方法来创建具体对象。
请注意,以上是抽象工厂模式和工厂方法模式的一般区别,具体情况可能因应用场景和设计要求而有所不同。