TypeScript | 设计模式03 - 工厂模式

简介: 工厂,是创建产品的地方。在软件设计中的工厂模式,就是封装和管理对象的创建。工厂模式,具体划分的话,有简单工厂模式和工厂方法模式,根据抽象程度划分,有工厂方法模式和抽象工厂模式

前言

工厂,是创建产品的地方。在软件设计中的工厂模式,就是封装和管理对象的创建。工厂模式,具体划分的话,有简单工厂模式和工厂方法模式,根据抽象程度划分,有工厂方法模式和抽象工厂模式

简单工厂模式

简单理解,类和工厂一样,一件衣服的出厂其中包含了一系列的制作流程。某一类的创建过程也是经过一些列的流程,可以使用简单工厂模式。

场景:要new多个同一类型对象时可以考虑使用简单工厂

interface IClassFactory {
  doDeal(): void;
}
​
class productA implements IClassFactory {
  public constructor() {}
  doDeal() {
    console.log("deal A");
  }
}
class productB implements IClassFactory {
  public constructor() {}
  doDeal() {
    console.log("deal B");
  }
}
​
class ClassFactory {
  constructor() {}
​
  public static dealOperate(type: string): IClassFactory {
    switch (type) {
      case "productA":
        return new productA();
      case "productB":
        return new productB();
      default:
        throw new Error("undefine product");
    }
  }
}
​

工厂方法模式

理解

但是对于简单工厂模式,只能是针对某一对象创建一个工厂,若增加其他的对象只能是修改工厂类,违反了对扩展开放、对修改的关闭的原则,所以可以将工厂类抽象出一个基类,不同的产品继承基类,自己实现自己的子工厂。

​
abstract class Car {
    abstract run():void;
}
​
class Car110 extends Car{
    run() {
        console.log('手动开启 car110 汽车');
    }
}
​
class Car220 extends Car {
    run() {
        console.log('全自动开启 car220 汽车');
    }
}
​
interface CarFactory {
    productCar():Car;
}
​
class Car110Factory implements CarFactory {
    productCar(): Car {
        return new Car110();
    }
​
}
​
class Car220Factory implements CarFactory {
    productCar(): Car {
        return new Car220();
    }
}
​
(()=>{
    const car110Factory = new Car110Factory();
    const car220Factory = new Car110Factory();
​
​
    const car110 =car110Factory.productCar();
    const car220 =car220Factory.productCar();
​
    car110.run();
    car220.run();
})();

工厂方法模式不是简单工厂模式的升级,它们是2种不同的设计模式。可以从代码上分析,Car110和Car220开启方式方式不一致,使用简单工厂模式比较难做到,所以需要每个Car类封装自己的工厂,但是很明显如果另外一种Car的时候就需要再加一个工厂类和Car类

场景

当产品对象需要进行不同的加工时可以考虑工厂方法。

对比

  • 简单工厂模式:生产的产品比较少,调用方只需要知道相关参数即可调用
  • 工厂方法模式:较大的系统,较多的产品种类

其实两种模式可以自由组合,当产品较多时,如果情况允许可以将产品做分类,然后和简单工厂配合使用

目录
相关文章
|
设计模式 前端开发 JavaScript
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
|
设计模式 JavaScript
TypeScript | 设计模式09 - 装饰者模式
装饰模式又称为包装模式,对象被包装后,还可以继续包装添加新的功能,从而扩展对象的功能,通过装饰模式可以使系统更具有弹性,且其遵循了面向对象原则:对外开放,对修改关闭。
92 0
|
设计模式 JavaScript 关系型数据库
TypeScript | 设计模式06 - 适配器模式
适配器模式 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
96 0
|
设计模式 JavaScript 安全
TypeScript | 设计模式05 - 代理模式
为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 比如,某对象需访问目标对象,但由于某种情况,不适合或不能直接访问目标对象,通过一个中介进行访问,这个中介就是代理对象。
431 0
|
设计模式 JavaScript
TypeScript | 设计模式04 - 建造者模式
建造者模式 也叫做 生成器模式
170 0
|
设计模式 JavaScript 前端开发
TypeScript | 设计模式02 - 原型模式
原型模式 用一个已经创建的实例为原型,通过复制该原型实例来创建一个和原型相同或类似的新对象。简单说,通过克隆对象来实现一个新的对象。
120 0
|
设计模式 安全 JavaScript
TypeScript|设计模式01-单例模式
本文首先谈到单例模式,顾名思义,就是在整个系统中只有一个对象,且该对象应当是全局性的。在架构设计的过程,可以想想哪些内容是需要考虑一个全局唯一的,像系统的回收站,只能打开一个;再比如,日志应用,是都可以考虑使用单例模式?
225 0
|
设计模式 JavaScript 前端开发
TypeScript|设计模式00
设计模式是软件开发过程中总会涉及到一部分知识,是程序员必备的知识点。准备使用Type Script边巩固typescript边学习设计模式。
125 0
|
设计模式 存储 JavaScript
TypeScript装饰器与设计模式
TypeScript装饰器与设计模式
|
设计模式 JavaScript C++
图解设计模式之发布-订阅模式(TypeScript)下
图解设计模式之发布-订阅模式(TypeScript)下
174 0