工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。
工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类定义需要创建的对象类型。
// 安全模式创建的工厂类
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 工厂方法封装了复杂的创建过程,对于使用者来说就很方便了。
什么时候使用工厂模式
以下几种情景下工厂模式特别有用:
- 对象的构建十分复杂
- 需要依赖具体环境创建不同实例
- 处理大量具有相同属性的小对象
什么时候不该用工厂模式
不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。