文章

简单工厂模式

简单工厂模式

简单工厂模式

概念

简单工厂模式也叫静态工厂模式,理念就是创建对象:用一个工厂对象创建同一类对象的实例。

简单工厂模式(Simple Factory Pattern):定义一个工厂,它可以根据参数的不同返回不同的实例,被创建的实例通常都具有共同的方法或父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于创建型模式。

实例

场景:假如我们是一家工厂,现能生产两种产品:卡车和轮船。

ES5 实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function Factory(type) {

  // 生产卡车的构造函数(流水线)
  function Truck() {
    this.name = '卡车';
    this.deliver = function () {
      console.log(`您要的【${this.name}】生产好了`);
    }
  }

  // 生产轮船的构造函数(流水线)
  function Ship() {
    this.name = '轮船';
    this.deliver = function () {
      console.log(`您要的【${this.name}】生产好了`);
    }
  }

  switch (type) {
    case 'truck':
      return new Truck(); // 返回 卡车 实例
    case 'ship':
      return new Ship(); // 返回 轮船 实例
    default:
      throw new Error('只能生产卡车和轮船两种产品');
  }
}

// 需求方要生产 卡车
// 卡车实例
const truck = Factory("truck");
console.log('卡车实例:', truck);
// 交付卡车
truck.deliver();  // 您要的【卡车】生产好了

// 需求方要生产 轮船
// 轮船实例
const ship = Factory("ship");
console.log('轮船实例:', ship);
// 交付 轮船
ship.deliver(); // 您要的【轮船】生产好了

上述代码中,Factory 就是一个工厂,Factory 能生产两种产品 卡车 和 轮船,用工厂函数时,只需传递 truck 或 ship 就可获取对应的实例对象。

ES6 实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 产品基类
class Product {
  constructor(name) {
    this.name = name;
  }

  deliver() {};
}

// 卡车
class Truck extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 轮船
class Ship extends Product {
  deliver() {
    console.log(`您要的【${this.name}】生产好了`);
  };
}

// 工厂基类:工厂
class Factory {
  // 生产哪种产品由需求方决定
  static createProduct(type) {
    switch (type) {
      case 'truck':
        return new Truck('卡车');
      case 'ship':
        return new Ship('轮船');
      default:
        throw new Error('只能生产卡车和轮船两种产品');
    }
  }
}

// 需求方要生产 卡车
Factory.createProduct('truck').deliver(); // 您要的【卡车】生产好了

// 需求方要生产 轮船
Factory.createProduct('ship').deliver(); // 您要的【轮船】生产好了

简单工厂,用户不需要知道具体产品的类名,只需要知道对应的参数即可,对于一些复杂的类名,可以减少用户的记忆量,同时用户无需了解这些对象是如何创建及组织的,有利于整个软件体系结构的优化。

所以,使用简单工厂,是将类的实例化交给工厂函数去做,对外提供统一的方法。在代码中 new 是一个需要慎重考虑的操作,new 出现的次数越多,代码的耦合性就越强,可维护性就越差,简单工厂,就是在上面做了一层抽象,将 new 的操作封装了起来,向外提供静态方法供用户调用,这样就将耦合集中到了工厂函数中,而不是暴露在代码的各个位置。

####

优点

  • 当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

适用场景

  • 正确传参,就可以获取所需要的对象,无需知道内部实现细节;
  • 创建对象数量少(稳定),对象的创建逻辑不复杂;

不适用场景

  • 创建的对象数量多,对象的创建逻辑复杂,导致判断逻辑臃肿,难以维护。

这时业务扩展,需要能生产飞机,那么需要怎么做呢?修改工厂基类,这违反了设计模式的**开闭原则**(Open Closed Principle),该原则是指软件应该对扩展开放,而对修改关闭。如果业务复杂一些就不合适了,而工厂方法模式就是该问题的解决方案。

开闭原则:对扩展开放,对修改封闭;增加新需求的时候,我们需要做的是增加新代码,而非去修改源码;

本文由作者按照 CC BY 4.0 进行授权

© 独行的风. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

本站总访问量 本站访客数 本文阅读量