Skip to main content

工厂模式 Factory Pattern

🎺介绍

  • new 操作单独封装
  • 遇到 new 时要考虑工厂模式

⛹示例

类图:

classDiagram
Creator --> Product
class Creator {
+create(name) Product
}
class Product {
+ name: String
+init() void
+fn1()
}
class Creator {
create(name) {
return new Product(name)
}
}

class Product {
constructor(name) {
this.name = name;
}
init() {
console.log('init')
}

fn1() {
console.log('fn1')
}
}

const creator = new Creator()
const c = creator.create('olu')
c.init()
c.fn1()

⛹️应用场景

jQuery - $('div')

class jQuery {
constructor(seletor) {
let slice = Array.prototype.slice
let dom = slice.call(document.querySelectorAll(seletor))
let len = dom ? dom.length : 0
for (let i = 0; i < len; i += 1) {
this[i] = dom[i]
}
this.length = len
this.seletor = seletor || ''
}
append(node) {

}
addClass(name) {

}
html(data)
}

window.$ = function(seletor) {
return new jQuery(seletor);
}

React.createElement

let profile = <div>
<img src="olu-cool.png" className="img"/>
<h1>{[user.name, user.age].join(' ')}</h1>
</div>

上面的代码编译完是下面的样子👇🏻

let profile = React.createElement("div", null,
React.createElement("img", { src: "olu-cool.png", className: "img" }),
React.createElement("h1", null, [user.name, user.age].join(' '))
)
class Vnode(tag, attrs, children) {
// ...
}
React.createElement = function(tag, attrs, children) {
return new Vnode(tag, attrs, children)
}

Vue 异步组件

Vue.component('async-example', (resolve, reject) => {
setTimeout(() => {
resolve({
template: '<div>this is async</div>',
})
}, 500)
})

设计原则验证

  • 构造函数和创建者分离
  • 符合开放封闭原则