什么是抽象工厂?
一种创建型设计模式,它提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定它们的具体类。抽象工厂允许一个系统的产品等级结构可在不修改代码的情况下改变。
关键组成:
-
抽象工厂(Abstract Factory): 它是一个接口或抽象类,定义了创建一组相关对象的方法,每个方法对应一个具体的产品家族。
-
具体工厂(Concrete Factory): 实现抽象工厂接口,负责实例化一组具体的产品。
-
抽象产品(Abstract Product): 定义了产品的接口,具体产品将实现这个接口。
-
具体产品(Concrete Product): 实现了抽象产品接口的具体对象。
示例:
// 抽象产品
class AbstractAnimal {
speak() {
// 抽象方法,由具体产品实现
}
}
// 具体产品
class ConcreteDog extends AbstractAnimal {
speak() {
return "Woof!";
}
}
// 具体产品
class ConcreteCat extends AbstractAnimal {
speak() {
return "Meow!";
}
}
// 抽象工厂
class AbstractAnimalFactory {
createDog() {
// 抽象方法,由具体工厂实现
}
createCat() {
// 抽象方法,由具体工厂实现
}
}
// 具体工厂
class ConcreteAnimalFactory extends AbstractAnimalFactory {
createDog() {
return new ConcreteDog();
}
createCat() {
return new ConcreteCat();
}
}
// 客户端代码
const animalFactory = new ConcreteAnimalFactory();
const dog = animalFactory.createDog();
const cat = animalFactory.createCat();
console.log(dog.speak()); // 输出: Woof!
console.log(cat.speak()); // 输出: Meow!
//在抽象工厂模式中,一个具体工厂需要实现多个创建方法,每个方法对应一个产品。
与工厂模式之间的区别
工厂模式:
-
产品等级结构:
- 工厂模式通常用于创建单一产品的等级结构。每个具体工厂对应一个具体产品。
-
创建方法数量:
- 一个具体工厂只需实现一个创建方法。
-
关注点:
- 工厂模式更注重于一个产品的实例化,通常用于创建同一类型或类别的产品。
抽象工厂模式:
-
产品等级结构:
- 抽象工厂模式用于创建一组相关或依赖的产品的等级结构。每个具体工厂对应一组具体产品。
-
创建方法数量:
- 一个具体工厂需要实现多个创建方法,每个方法对应一个产品。
-
关注点:
- 抽象工厂模式更注重于一组相关产品的实例化,用于创建整个产品家族。这样的模式允许客户端使用一组产品而无需关心它们的具体类型。
*需要注意的是:工厂模式和抽象工厂模式都是创建型设计模式,它们的主要目标是创建对象。在这两种模式中,工厂方法或抽象工厂方法都会返回一个具体的对象实例。