掌握工厂方法模式,轻松处理对象的创建。
欢迎来到 TypeScript 设计模式系列,该系列介绍了使用 TypeScript 进行 Web 开发的一些有用的设计模式。
之前的文章如下:
设计模式对于 web 开发人员来说非常重要,掌握它们可以让我们写出更好的代码。在本文中,我将使用 TypeScript 来介绍工厂方法模式。
工厂方法模式,也称为工厂模式,也称为多态工厂模式,属于创造模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成特定的产品对象,这样做的目的是将产品类的实例化延迟到工厂子类,即通过工厂子类来确定应该实例化哪个特定的产品类。
上图中我模拟了用户购买汽车的过程,Bytefer和Chris1993分别向SuperX01和SuperX02工厂订购SuperX01和SuperX02车型,然后工厂生产相应的车型,生产完成后交付给用户。
让我们看看如何使用工厂方法来描述汽车工厂生产给定车型的过程。
为了更好地理解下面的代码,让我们先看看相应的 UML 图:
工厂方法模式包括以下角色:
-
Product(汽车):抽象产品
-
Concrete Product(SuperX01):实体产品
-
Factory(VehicleFactory):抽象工厂
-
ConcreteFactory(SuperX01Factory):实体工厂
接下来,我们定义一个抽象类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");
}
}
然后,我们定义了 VehicleFactory
类来表示汽车工厂。这个抽象类包含了一个抽象方法 produceVehicle
,这就是所谓的工厂方法。
abstract class VehicleFactory {
abstract produceVehicle(): Vehicle;
}
基于VehicleFactory
抽象类,我们定义了SuperX01Factory
和 SuperX02Factory
工厂类,用于生产 SuperX01 和 SuperX02 车型:
class SuperX01Factory extends VehicleFactory {
produceVehicle(): Vehicle {
return new SuperX01();
}
}
class SuperX02Factory extends VehicleFactory {
produceVehicle(): Vehicle {
return new SuperX02();
}
}
创建了 SuperX01Factory
和 SuperX02Factory
工厂类之后,我们可以开始生产汽车了:
const superX01Factory = new SuperX01Factory();
const superX02Factory = new SuperX02Factory();
const superX01Vehicle = superX01Factory.produceVehicle();
const superX02Vehicle = superX02Factory.produceVehicle();
superX01Vehicle.run();
superX02Vehicle.run();
当你成功运行上述代码时,终端将输出以下结果:
SuperX01 start
SuperX02 start
最后,让我们总结一下工厂方法模式的使用场景:
-
在工厂方法模式中,抽象的工厂类只需要提供一个创建产品的接口,而其子类则决定要创建的具体对象,利用面向对象的多态性以及Liskov替换原则,当程序运行时,子类对象将重写父类对象,使得系统更易于扩展。
如果您有任何问题,请随时给我留言。我以后会继续介绍其他的模式,如果您感兴趣,
欢迎关注公众号:文本魔术,了解更多