【JS设计模式】工厂方法模式

111 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

工厂方法模式(Factory Method): 通过对产品类的抽象使其创建业务,主要负责创建多类产品的实例。

安全模式类

安全模式类是说可以屏蔽使用/对类的错误使用/造成的错误。比如说,我们都知道,一个函数是否为构造函数,取决于我们是否通过new关键字来调用它。 但是有些时候我们并不知道某个对象是一个类,那么在使用它的时候就会忽略掉new关键字,这样得到的并不适合我们所预期的对象。 安全模式类就是为了解决这种问题的。

安全模式类的思路是: 在构造函数开始的时候,先判断当前对象的this是否指向当前类,如果是的话,则通过new关键字来创建一个实例对象,如果不是的话,则要重新返回新创建的对象。

代码思路:

var Demo = function () {
    if (!(this instanceof Demo)) {
        return new Demo()
    }
    // ...
}

工厂方法模式

该模式的本意指的是: 将实际创建对象的工作推迟到子类当中,这样一来,核心类就成了抽象类了。

它与简单工厂模式的区别就是,简单工厂模式就像你去商店买东西,你说老板,来个足球,然后老板就给你一个足球,来个篮球,老板就给你一个篮球。 而工厂方法模式,则是你给老板一个进货单,对老板说:老板,照着上面列的东西给我捡货,然后老板就照着你清单上的货物给你捡货。

简单工厂模式中每个类的实现是在工厂的外部,而工厂方法模式中每个类的实现则是在工厂原型上。

安全的工厂方法

// 安全模式创建的工厂类
var Factory = function (type, content) {
    if (this instanceof Factory) {
        var s = new this[type](content)
        return s
    } else {
        return new Factory(type, content)
    }
}
// 工厂原型上创建基类
Factory.prototype = {
    Java: function (content) {/*....*/},
    PHP: function (content) {/*....*/},
    UI: function (content) {/*....*/},
    // ... 更多类型的基类
}
// 使用(进货清单)
var data = [
    {type:"Java",content:'Java哪家强'},
    {type:"PHP",content:'PHP哪家强'},
]
// 老板开始帮你进货
data.forEach(item=>Factory(item.type,item.content))