掌握抽象工厂模式,轻松处理对象的创建。
欢迎来到 TypeScript 设计模式系列,该系列介绍了使用 TypeScript 进行 Web 开发的一些有用的设计模式。
之前的文章如下:
设计模式对于 web 开发人员来说非常重要,掌握它们可以让我们写出更好的代码。在本文中,我将使用 TypeScript 来介绍抽象工厂模式。
抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
在工厂方法模式中,特定的工厂负责生产特定的产品,每个特定的工厂对应一个特定的产品,工厂方法也是唯一的,一般情况下,特定的工厂中只有一个工厂方法或一组重载的工厂方法,但有时我们需要一个工厂可以供应多个产品,而不是单个产品。
上图中,我模拟了用户的购车流程,Bytefer向SuperX工厂订购了SuperX01,工厂按照SuperX01对应的车型生产,生产完成后交付给Bytefer,Chris1993向同一家SuperX工厂订购了SuperX02,工厂按照SuperX02对应的车型生产,生产完成后交付给Chris1993。
让我们看看如何使用抽象工厂来描述汽车工厂生产给定车型的过程。
为了更好地理解下面的代码,让我们先看看相应的 UML 图:
抽象的工厂模式包括以下角色:
-
Product(汽车):抽象产品
-
Concrete Product(SuperX01):混凝土产品
-
Factory(SuperXFactory):抽象工厂
-
ConcreteFactory(ConcreteSuperXFactory):混凝土工厂
接下来,我们定义一个抽象类Vehicle
和它的两个子类 SuperX01
和 SuperX02
来表示不同类型的车辆。
abstract class Vehicle {
abstract run(): void;
}
class SuperX01 extends Vehicle {
run(): void {
console.log("SuperX01 start");
}
}
class SuperX02 extends Vehicle {
run(): void {
console.log("SuperX02 start");
}
}
然后,我们定义了 SuperXFactory
类来表示汽车工厂。这个抽象工厂包含了生产 SuperX01 和 SuperX02 模型汽车的抽象方法。
abstract class SuperXFactory {
abstract produceSuperX01(): SuperX01;
abstract produceSuperX02(): SuperX02;
}
基于SuperXFactory
抽象类,我们定义了ConcreteSuperXFactory
工厂类,用于生产 SuperX01 和 SuperX02 车型:
class ConcreteSuperXFactory extends SuperXFactory {
produceSuperX01(): SuperX01 {
return new SuperX01();
}
produceSuperX02(): SuperX02 {
return new SuperX02();
}
}
创建了 ConcreteSuperXFactory
工厂类之后,我们可以开始生产车辆:
const superXFactory = new ConcreteSuperXFactory();
const superX01 = superXFactory.produceSuperX01();
const superX02 = superXFactory.produceSuperX02();
superX01.run();
superX02.run();
当你成功运行上述代码时,终端将输出以下结果:
SuperX01 start
SuperX02 start
我们在前一篇文章中已经介绍了工厂方法模式,那么它与抽象工厂模式有什么区别呢?
抽象工厂模式和工厂方法模式的最大区别在于,工厂方法模式针对一个产品层次结构,而抽象工厂模式需要面对多个产品层次结构,并且一个工厂层次结构可以负责多个不同的产品层次结构。
产品对象的创建。当一个工厂层次结构可以创建属于不同产品层次结构的产品族中的所有对象时,抽象工厂模式比工厂方法模式更简单、更高效。
如果您有任何问题,请随时给我留言。我以后会继续介绍其他的模式,如果您感兴趣,
欢迎关注公众号:文本魔术,了解更多