JavaScript 设计模式 - 工厂模式
欢迎来到我的新开发系列,在这里我会尽力使用JavaScript解释设计模式!
什么是设计模式?
在软件工程领域,设计模式通常是一种可复用的解决方案,或者更确切地说,是一种蓝图或模板,我们可以在不同情况下和编程语言中使用它来解决日常开发问题。
它们是开发人员在设计和开发软件应用程序时可以遵循的规范化最佳实践。设计模式可以通过提供经过测试和验证的
开发范例 来加快开发过程。
存在不同类型的设计模式。
一些主要类别包括:
- 创建模式
- 结构模式
- 行为模式
今天我们将讨论属于创建类的工厂模式。
为什么要使用工厂模式?
工厂模式通常用于处理创建对象时可能出现的问题,
尤其是在需要创建许多不同类型的对象的情况下。
在这种情况下,工厂模式允许您调用工厂方法(在接口中指定或在基类中实现),该方法代替构造函数来处理对象的创建。
通过调用工厂方法,您可以避免为每个创建的对象重新分配内存,相反,工厂方法在被调用时只会执行一次内存分配。
简单地说,我们的工厂方法是一个集中的地方,或者更好的是,一个制造不同类型物体的工厂。
我如何使用工厂模式?
免责声明:在这种情况下,您可以自由使用任何您喜欢的设计模式并开发您自己的解决方案。我并没有明确要求您在遇到这种情况时只能使用工厂模式。
让我们想象以下场景。
您受雇为一家汽车修理店开发一款应用程序。店主希望开发一个易于操作的界面,能够记录店内维修的所有车辆类型。每天,店主和他的雇主会处理数十种不同类型的车辆。您需要找到一种简洁明了的方法,将所有这些类型的车辆导入数据库。
在这个例子中,由于我在过去几个月里对 JavaScript 有了更多的了解,所以我们将使用JavaScript。
需要注意的是,这类模式并不局限于特定语言,你可以将它们用于任何你喜欢的语言。
- 首先,我们假设我们的机械师只负责卡车和轿车。虽然卡车和轿车的种类繁多,但为了本教程的目的,我们只讨论第一类的车辆。
考虑到这一点,让我们为这两类车辆创建两个类。
function Car(name, type) {
this.name = name;
this.type = type;
}
function Truck(name, type) {
this.name = name;
this.type = type;
}
这看起来相当原始和基础,ECMA2015 中实现了class关键字,有更好的方法来实现这一点,不过别急,先跟我来。
了解了这些基础知识后,我们来创建工厂方法。
function VehiclesFactoryMethod() {
this.create = function(name, type) {
switch(type) {
case "Car":
return new Car(name, type);
case "Truck":
return new Truck(name, type);
default;
}
}
}
有了工厂方法,我们就可以用它来创建对象了!
我们来测试一下。
// Let's instantiate our factory method object.
const VehiclesFactoryMethod = new VehiclesFactoryMethod();
// This array will simulate our Database for the purposes of this tutorial
const vehicles = [];
// Let's fill our array with some vehicles!
vehicles.push(VehiclesFactoryMethod.create("BMW", "Car"));
vehicles.push(VehiclesFactoryMethod.create("MAN", "Truck"));
让我们测试一下!
为了进一步测试,我们创建一个显示函数。
// This function will output the inserted vehicles in a more stylized context
function print() {
console.log("Database of our vehicles : ");
console.log("Name: " + this.name);
console.log("Type: " + this.type);
}
// Let's loop through our array of vehicles
// And call **showVehicles*** method to print them out.
vehicles.forEach( vehicle => {
print.call(vehicle);
});
// If we have done everything correctly, this will be our console log output
// Database of our vehicles :
// Name: BMW
// Type: Car
// Database of our vehicles :
// Name: MAN
// Type: Truck
通过这种设置,每次我们想要创建 Car 或 Truck 类的新对象时,我们需要做的就是调用VehiclesFactoryMethod,传递所需的属性,工厂方法将负责您需要的所有内存分配和对象创建。
结论
-
当您事先不知道代码应使用的对象的确切类型和依赖关系时,请使用工厂方法。
-
如果您想通过重用现有对象而不是每次都重新构建它们来节省系统资源,请使用工厂方法。在处理大型、资源密集型对象(例如数据库连接、文件系统和网络资源)时,您经常会遇到这种需求。
优点:
- 避免了创建者和具体产品之间的紧密耦合。
- 单一职责原则。您可以将产品创建代码移到程序中的一处,使代码更易于支持。
- 开放/封闭原则。你可以在不破坏现有客户端代码的情况下将新类型的产品引入到程序中。
- 内存保存和对对象的更好控制
缺点:
- 就我使用工厂方法的经验而言,目前为止我唯一觉得不好的地方是代码可能会变得更复杂,因为你需要引入很多新的子类来实现这个模式。最好的情况是将这个模式引入到现有的创建者类层次结构中。
您应该使用工厂方法吗?
绝对是的!
这取决于你在哪里以及如何使用它。
我发现它在很多情况下都非常有用。
如果你在阅读本文之前就已经了解工厂模式,请在下方留言,分享你使用它的具体场景和方法。
我希望能够了解更多,并探讨潜在的改进方法。
下周日再见,我们将讨论另一种设计模式!
鏂囩珷鏉ユ簮锛�https://dev.to/kristijanfistrek/javascript-design-patterns-factory-pattern-562p