Java中的抽象工厂模式
1. 概述
在本文中,我们将讨论抽象工厂设计模式。 《Design Patterns: Elements of Reusable Object-Oriented Software 》一书指出,抽象工厂**“提供了一个接口,用于创建相关或依赖对象的系列,而无需指定它们的具体类”。**换句话说,这个模型允许我们创建遵循一般模式的对象。 JDK 中抽象工厂设计模式的一个示例是 javax.xml.parsers.DocumentBuilderFactory 类的 newInstance()。
2. 抽象工厂设计模式示例
在本例中,我们将创建工厂方法设计模式的两个实现:AnimalFactory和ColorFactory。
之后,我们将使用抽象工厂AbstractFactory 管理对它们的访问:
首先,我们将创建一个Animal类家族,稍后将在我们的抽象工厂中使用它。 这是Animal界面:
public interface Animal {
String getAnimal();
String makeSound();
}
和一个具体的实现Duck:
public class Duck implements Animal {
@Override
public String getAnimal() {
return "Duck";
}
@Override
public String makeSound() {
return "Squeks";
}
}
此外,我们可以完全以这种方式创建Animal接口(如Dog、Bear等)的更具体的实现。
抽象工厂处理依赖对象的族。考虑到这一点,我们将引入另外一种Color系列作为具有一些实现(White、brown……)的接口。
现在我们已经准备好了多个系列,我们可以为它们创建一个AbstractFactory接口:
public interface AbstractFactory<T> {
T create(String animalType) ;
}
接下来,我们将使用我们在上一节中讨论的工厂方法设计模式来实现AnimalFactory:
public class AnimalFactory implements AbstractFactory<Animal> {
@Override
public Animal create(String animalType) {
if ("Dog".equalsIgnoreCase(animalType)) {
return new Dog();
} else if ("Duck".equalsIgnoreCase(animalType)) {
return new Duck();
}
return null;
}
}
同样,我们可以使用相同的设计模式为Color接口实现一个工厂。
设置完所有这些后,我们将创建一个FactoryProvider类,该类将为我们提供AnimalFactory或ColorFactory的实现,具体取决于我们提供给*getFactory()*方法的参数:
public class FactoryProvider {
public static AbstractFactory getFactory(String choice){
if("Animal".equalsIgnoreCase(choice)){
return new AnimalFactory();
}
else if("Color".equalsIgnoreCase(choice)){
return new ColorFactory();
}
return null;
}
}
3. 何时使用抽象工厂模式:
- 客户端独立于我们如何在系统中创建和组合对象
- 该系统由多个对象族组成,这些族旨在一起使用
- 我们需要一个运行时值来构造一个特定的依赖项
虽然该模式在创建预定义对象时非常有用,但添加新对象可能具有挑战性。要支持新类型的对象,需要更改AbstractFactory类及其所有子类。