设计模式-工厂模式

工厂

工厂通常是一个用来创建其他对象的对象。工厂是构造方法抽象,用来实现不同的分配方案。

工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。

工厂方法模式抽象工厂模式生成器模式,甚至是单例模式都应用了工厂的概念

工厂模式

在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式根据抽象程度的不同可以分为:简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式

又称静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

专门定义一个类(工厂类)来负责创建其他类的实例。可以根据创建方法的参数来返回不同类的实例,被创建的实例通常都具有共同的父类。

实现

class BasketBall {
  constructor() {
    this.intro = '篮球盛行于美国';
  }
  getMember() {
    console.log('每个队伍需要5名队员');
  }
}

class FooterBall {
  constructor() {
    this.intro = '足球在世界范围内很流行';
  }
  getMember() {
    console.log('每个队伍需要11名队员');
  }
}

// 简单工厂模式
const sportsFactory = (name) => {
  switch(name) {
    case 'NBA':
      return new BasketBall();
    case 'wordcup':
      return new FooterBall();
  }
}

工厂方法模式

通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例。

工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中。创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分。工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题。由子类实现这个方法来创建具体类型的对象。

对象创建中的有些过程包括决定创建哪个对象、管理对象的生命周期,以及管理特定对象的创建和销毁的概念。——维基百科

抽象工厂模式

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。—— 维基百科

优缺点

优点

  • 可以使代码结构清晰,有效地封装变化。
  • 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度。
  • 扩展性高。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

应用与实践

参考链接

维基百科 - 工厂方法

JavaScript设计模式与实践–工厂模式 - 掘金

学习并理解 23 种设计模式- 掘金

https://xie.infoq.cn/article/88c926822394aa1c80847dd2a