1

JavaScript是一种介于对象的语言,在编程过程中几乎所有用的东西都是对象。但是JavaScript又不是一种真正的面向对象编程语言,因为JavaScript中没有class,不过在ECMAScript第6版本中引入了class的概念,作为对象的模板,通过class关键字可以定义类。

既然JavaScript已经有了类的概念,逐渐也就对设计模式也有了可发挥的空间,设计模式主要分文三大类型创造型设计模式、结构型设计模式、行为设计模式,除了ES6推行,比ES6更加强大的是TypeScript,其中不单单包含class的概念,还包含了泛型、抽象等,对面向对象的认识更加深刻,基于TypeScript说明一下简单工厂的使用。

什么是简单工厂

简单工厂模式:又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 ——节选自百度百科

根据提供给它的数据,返回一个类的实例。通常它返回的类都有一个公共的父类(或者接口对象)。简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。如数据库生产工厂就是简单工厂的一个应用。

采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

简单工厂优缺点

简单工厂简单的来说其实就是定义一个创建对象的类,由这个类封装实例化对象的行为。简单工厂可以将对象的创建和对象本身的业务处理分离降低系统的耦合程度,是的两者修改起来都相对容易一些,在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,简单工厂最大的问题在于工厂类的职责过重,增加新的产品需要修改稿工厂类的判断逻辑,这一点不太符合开闭原则。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。通过上面的所说可以总结得出:

优点
  1. 客户类与具体子类解耦
  2. 客户类不需要知道所有子类的细节
  3. 使用配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
  1. 工厂类职责过重
  2. 增加工厂类增加了系统复杂度
  3. 系统扩展困难,系统发生变化需要修改工厂类
  4. 工厂由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

示例

简单工厂主要包含三个类,分别是:

  1. 简单工厂类
  2. 抽象产品类
  3. 具体产品类

基于这三个个类完成简单工厂,工厂类负责创的对象比较少,由于创建的对象少,不会造成工厂方法重的业务逻辑太过于复杂。客户端只知道传入工厂类的参数,对于创建对象不关系,客户端不需要关系创建的细节,甚至连类名都不需要记住,只需要知道类型所对应的参数即可。

类图如下所示:

image

代码示例:

// 抽象产品接口
interface Product{}

// 具体产品一
class ConcreteProductA implements Product {
    constructor(){}
}

// 具体产品二
class ConcreteProductB implements Product {
    constructor(){}
}

// 简单工厂
class SimpleFactory {
    public static createProduct(type : number) : Product {
        let product = null;
        if (type === 1) {
            product = new ConcreteProduct1();
        } else if ( type === 2) {
            product = new ConcreteProduct2();
        }
        return product;
    }
}
// 使用
let product = SimpleFactory.createProduct(1);
console.log(product);

总结

创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用过程分离。简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。


Aaron
4k 声望6.1k 粉丝

Easy life, happy elimination of bugs.