工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。
工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类定义需要创建的对象类型。
// 安全模式创建的工厂类
var Factory = function (type, content) {
    if (this instanceof Factory) {
        return this[type](content);
    } else {
        return new Factory(type, content);
    }
}

// 工厂原型中设置创建所有类型数据的基类
Factory.prototype = {
    Yuwen: function (content) {
        console.log(content);
    },
    Shuxue: function(content) {
        console.log(content);
    },
    English: function(content) {
        console.log(content);
    }
}

var data = [
    {
        type: 'Yuwen',
        content: '我是语文老师!'
    },
    {
        type: 'Shuxue',
        content: '我是数学老师!'
    },
    {
        type: 'English',
        content: '我是英语老师!'
    }
];

for (var i = 0; i < data.length; i++) {
    Factory(data[i].type, data[i].content);
}

源码中的工厂模式

  • Vue中的工厂模式

和原生的document.createElement 类似,Vue在生成虚拟DOM的时候,提供了createElement方法用来生成VNode,用来作为真实DOM节点的映射:

createElement('div', { class: 'body' }, [
    createElement('a', { class: 'title', attrs: { href: 'www.baidu.com' } }),
    createElement('span', { class: 'content' }, '百度网址')
])

createElement 函数结构大概如下:

class Vnode (tag, data, children) { ... }

function createElement(tag, data, children) {
      return new Vnode(tag, data, children)
}

可以看到Vue提供的 createElement 工厂方法封装了复杂的创建过程,对于使用者来说就很方便了。

什么时候使用工厂模式

以下几种情景下工厂模式特别有用:

  • 对象的构建十分复杂
  • 需要依赖具体环境创建不同实例
  • 处理大量具有相同属性的小对象

什么时候不该用工厂模式

不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。


杜子李_
0 声望0 粉丝