乐趣区

关于typescript:Typescript-设计模式之工厂方法

在现实生活中,工厂是负责生产产品的,比方牛奶、面包或礼物等,这些产品满足了咱们日常的生理需求。此外,在日常生活中,咱们也离不开大大小小的零碎,这些零碎是由不同的组件对象形成。

而作为一名 Web 软件开发工程师,在软件系统的设计与开发过程中,咱们能够利用设计模式来进步代码的可重用性、可扩展性和可维护性。在泛滥设计模式当中,有一种被称为工厂模式的设计模式,它提供了创建对象的最佳形式。

工厂模式能够分为三类:

  • 简略工厂模式(Simple Factory Pattern)
  • 工厂办法模式(Factory Method Pattern)
  • 形象工厂模式(Abstract Factory Pattern)

本文阿宝哥将介绍简略工厂模式与工厂办法模式,而形象工厂模式将在后续的文章中介绍,上面咱们先来介绍简略工厂模式。

一、简略工厂模式

1.1 简略工厂模式简介

简略工厂模式又叫 静态方法模式 ,因为工厂类中定义了一个静态方法用于创建对象。简略工厂让使用者不必晓得具体的参数就能够创立出所需的”产品“类,即使用者能够间接生产产品而不须要晓得产品的具体生产细节。

置信对于刚接触简略工厂模式的小伙伴来说,看到以上的形容可能会感觉有点形象。这里为了让小伙伴更好地了解简略工厂模式,阿宝哥以用户买车为例,来介绍一下 BMW 工厂如何应用简略工厂模式来生产????。

在上图中,阿宝哥模仿了用户购车的流程,pingan 和 qhw 别离向 BMW 工厂订购了 BMW730 和 BMW840 型号的车型,接着工厂依照对应的模型进行生产并在生产实现后交付给用户。接下来,阿宝哥将介绍如何应用简略工厂来形容 BMW 工厂生产指定型号车子的过程。

1.2 简略工厂模式实战

  1. 定义 BMW 抽象类
abstract class BMW {abstract run(): void;
}
  1. 创立 BMW730 类(BMW 730 Model)
class BMW730 extends BMW {run(): void {console.log("BMW730 动员咯");
  }
}
  1. 创立 BMW840 类(BMW 840 Model)
class BMW840 extends BMW {run(): void {console.log("BMW840 动员咯");
  }
}
  1. 创立 BMWFactory 工厂类
class BMWFactory {public static produceBMW(model: "730" | "840"): BMW {if (model === "730") {return new BMW730();
    } else {return new BMW840();
    }
  }
}
  1. 生产并动员 BMW730 和 BMW840
const bmw730 = BMWFactory.produceBMW("730");
const bmw840 = BMWFactory.produceBMW("840");

bmw730.run();
bmw840.run();

以上代码运行后的输入后果为:

BMW730 动员咯 
BMW840 动员咯 

通过观察以上的输入后果,咱们能够晓得咱们的 BMWFactory 曾经能够失常工作了。在 BMWFactory 类中,阿宝哥定义了一个 produceBMW() 办法,该办法会依据传入的模型参数来创立不同型号的车子。

看完简略工厂模式实战的示例,你是不是感觉简略工厂模式还是挺好了解的。那么什么场景下应用简略工厂模式呢?要答复这个问题咱们须要来理解一下简略工厂的优缺点。

1.3 简略工厂模式优缺点

1.3.1 长处
  • 将创立实例与应用实例的工作离开,使用者不用关怀对象是如何创立的,实现了零碎的解耦;
  • 客户端毋庸晓得所创立的具体产品类的类名,只须要晓得具体产品类所对应的参数即可。
1.3.2 毛病
  • 因为工厂类集中了所有产品创立逻辑,一旦不能失常工作,整个零碎都要受到影响。
  • 零碎扩大艰难,一旦增加新产品就不得不批改工厂逻辑,在产品类型较多时,也有可能造成工厂逻辑过于简单,不利于零碎的扩大和保护。

理解完简略工厂的优缺点,咱们来看一下它的利用场景。

1.4 简略工厂模式利用场景

在满足以下条件下能够思考应用简略工厂模式:

  • 工厂类负责创立的对象比拟少:因为创立的对象比拟少,不会造成工厂办法中业务逻辑过于简单。
  • 客户端只需晓得传入工厂类静态方法的参数,而不须要关怀创建对象的细节。

介绍完简略工厂模式,接下来咱们来介绍本文的配角 ”工厂办法模式“

二、工厂办法模式

2.1 工厂办法简介

工厂办法模式(Factory Method Pattern)又称为工厂模式,也叫多态工厂(Polymorphic Factory)模式,它属于类创立型模式。

在工厂办法模式中,工厂父类负责定义创立产品对象的公共接口,而工厂子类则负责生成具体的产品对象, 这样做的目标是将产品类的实例化操作提早到工厂子类中实现 ,即通过工厂子类来确定到底应该实例化哪一个具体产品类。

在上图中,阿宝哥模仿了用户购车的流程,pingan 和 qhw 别离向 BMW 730 和 BMW 840 工厂订购了 BMW730 和 BMW840 型号的车型,接着工厂依照对应的模型进行生产并在生产实现后交付给用户。接下来,阿宝哥来介绍如何应用工厂办法来形容 BMW 工厂生产指定型号车子的过程。

2.2 工厂办法实战

  1. 定义 BMW 抽象类
abstract class BMW {abstract run(): void;
}
  1. 创立 BMW730 类(BMW 730 Model)
class BMW730 extends BMW {run(): void {console.log("BMW730 动员咯");
  }
}
  1. 创立 BMW840 类(BMW 840 Model)
class BMW840 extends BMW {run(): void {console.log("BMW840 动员咯");
  }
}
  1. 定义 BMWFactory 接口
interface BMWFactory {produceBMW(): BMW;
}
  1. 创立 BMW730Factory 类
class BMW730Factory implements BMWFactory {produceBMW(): BMW {return new BMW730();
  }
}
  1. 创立 BMW840Factory 类
class BMW840Factory implements BMWFactory {produceBMW(): BMW {return new BMW840();
  }
}
  1. 生产并动员 BMW730 和 BMW840
const bmw730Factory = new BMW730Factory();
const bmw840Factory = new BMW840Factory();

const bmw730 = bmw730Factory.produceBMW();
const bmw840 = bmw840Factory.produceBMW();

bmw730.run();
bmw840.run();

通过观察以上的输入后果,咱们能够晓得咱们的 BMW730Factory 和 BMW840Factory 工厂曾经能够失常工作了。相比后面的简略工厂模式,工厂办法模式通过创立不同的工厂来生产不同的产品。上面咱们来看一下工厂办法有哪些优缺点。

2.3 工厂办法优缺点

2.3.1 长处
  • 在零碎中退出新产品时,毋庸批改形象工厂和形象产品提供的接口,只有增加一个具体工厂和具体产品就能够了。这样,零碎的可扩展性也就变得十分好,更加合乎“开闭准则”。而简略工厂模式须要批改工厂类的判断逻辑。
  • 合乎繁多职责的准则,即每个具体工厂类只负责创立对应的产品。而简略工厂模式中的工厂类存在肯定的逻辑判断。
  • 基于工厂角色和产品角色的多态性设计是工厂办法模式的要害。它可能使工厂能够自主确定创立何种产品对象,而如何创立这个对象的细节则齐全封装在具体工厂外部。工厂办法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具备同一形象父类。
2.3.2 毛病
  • 在增加新产品时,须要编写新的具体产品类,而且还要提供与之对应的具体工厂类,零碎中类的个数将成对减少,在肯定水平上减少了零碎的复杂度,有更多的类须要编译和运行,会给零碎带来一些额定的开销。
  • 一个具体工厂只能创立一种具体产品。

最初咱们来简略介绍一下工厂办法的利用场景。

2.4 工厂办法利用场景

  • 一个类不晓得它所须要的对象的类:在工厂办法模式中,客户端不须要晓得具体产品类的类名,只须要晓得所对应的工厂即可,具体的产品对象由具体工厂类创立;客户端须要晓得创立具体产品的工厂类。
  • 一个类通过其子类来指定创立哪个对象:在工厂办法模式中,对于形象工厂类只须要提供一个创立产品的接口,而由其子类来确定具体要创立的对象,利用面向对象的多态性和里氏代换准则,在程序运行时,子类对象将笼罩父类对象,从而使得零碎更容易扩大。

三、参考资源

  • 简略工厂模式(SimpleFactoryPattern)
  • design-patterns – simple_factory
  • 工厂办法模式(Factory Method)

四、举荐浏览

  • 了不起的 TypeScript 入门教程
  • 了不起的 Deno 入门篇
  • 了不起的 Deno 实战教程
  • 你不晓得的 Blob
  • 你不晓得的 WeakMap
退出移动版