1. 前言

学习JavaScript也有一段时间了,在学习过程中遇到了各种各样的问题,但是很多问题也都会的到解决,JavaScript作为一门语言来讲,也就会存在设计模式,所谓的设计模式无非是程序设计的一种编程思想。

2. 简单工厂

简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

在实际的项目中,我们常常需要根据用户的权限来渲染不同的页面,高级权限的用户所拥有的页面有些是无法被低级权限的用户所查看。所以我们可以在不同权限等级用户的构造函数中,保存该用户能够看到的页面。在根据权限实例化用户。

工厂模式,你只需要修改工厂代码。其他地方引用工厂,可以做到只修改一个地方,其他代码都不动,就是解耦了。

如果你有很多地方都需要A的实例,那编写一个工厂专门生成A的实例(如果生成逻辑改变了,直接修改工厂)。那么这些需要A的实例的地方只需要从工厂中getObject()就可以了,完全不用管我的实例是咋来的。

ES6中给我们提供了class新语法,虽然class本质上是一颗语法糖,并也没有改变JavaScript是使用原型继承的语言,但是确实让对象的创建和继承的过程变得更加的清晰和易读。下面我们使用ES6的新语法来重写上面的例子。

使用ES6重写简单工厂模式时,我们不再使用构造函数创建对象,而是使用class的新语法。

看下面的例子:

class BicycleShop {     sellBicycle( model ){         var bicycle;         switch( model ){             case "The Speedster":                 bicycle = new Speedster();                 break;             case "The Lowrider":                 bicycle = new Lowrider();                 break;             case "The Cruiser":             default:                 bicycle = new Cruiser();                 break;         }         return bicycle;     } } class Speedster {     go(){         console.log("Speedster")     } } class Lowrider {     go(){         console.log("Lowrider")     } } class Cruiser {     go(){         console.log("Cruiser")     } } class Bicycle {     run(type){         let bicycleShop = new BicycleShop();         let bicycle = bicycleShop.sellBicycle(type);         bicycle.go();     } } let bicycle = new Bicycle(); bicycle.run("The Speedster"); //  Speedster

在上面的代码中创建了一个BicycleShop类,里面有一个sellBicycle方法,这个方法接收一个参数,为了返回不同的类,来创建不同得方法。

我们可以思考一下,如果上面的方法不使用工厂方法的话,则是把其他类中的所有的所有的方法写在Bicycle方法里面,若要满足若干的需求,就需要写好多好多方法,使代码变得臃肿、混乱。

使用工厂方法的好处针对不同的方法,都用自己的业务逻辑,不需要担心他们到底是怎么实现的,方便后期的维护与拓展。

3. 工厂方法

工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。但是在JavaScript中很难像传统面向对象那样去实现创建抽象类。所以在JavaScript中我们只需要参考它的核心思想即可。我们可以将工厂方法看作是一个实例化对象的工厂类。

在简单工厂模式中,我们每添加一个构造函数需要修改两处代码。现在我们使用工厂方法模式改造上面的代码,刚才提到,工厂方法我们只把它看作是一个实例化对象的工厂,它只做实例化对象这一件事情! 我们采用安全模式创建对象。

虽然ES6也没有实现abstract,但是我们可以使用new.target来模拟出抽象类。