- 單例模式
概念:?jiǎn)卫J奖WC一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)
使用場(chǎng)景:有一些對(duì)象我們往往只需要一個(gè),比如全局緩存、瀏覽器的window對(duì)象
// 單例模式
var single = function() {
var instance = null
var getInstance = function () {
if (instance === null) {
instance = new Constructor()
}
return instance
}
var Constructor = function () {
this.name = 'hello'
}
return {
getInstance:getInstance
}
}()
- 工廠模式
概念:把相關(guān)的多個(gè)類(lèi)提供一個(gè)統(tǒng)一入口的一個(gè)模式,讓你從一個(gè)入口就可以獲得多個(gè)類(lèi)
使用場(chǎng)景:
(1)對(duì)象的構(gòu)建十分復(fù)雜
(2)需要依賴(lài)具體環(huán)境創(chuàng)建不同實(shí)例
(3)處理大量具有相同屬性的小對(duì)象
// 工廠模式
var Factory = function (type, payload) {
// 解決 不在構(gòu)造函數(shù)前面加上new的話,會(huì)報(bào)錯(cuò)的問(wèn)題
if (this instanceof Factory) {
return new Factory(type, payload)
}
// 公用代碼
this.name = paylod.name
return this[type](paylod)
}
// 非公用代碼
Factory.prototype = {
type1: function(payload) {
//...
},
type2: function (payload) {
// ...
}
}
- 抽象工廠模式
概念:在父類(lèi)里面設(shè)計(jì)好接口(沒(méi)有具體實(shí)現(xiàn)),具體的實(shí)現(xiàn)等到了子類(lèi)再重寫(xiě)
使用場(chǎng)景:解決了子類(lèi)實(shí)現(xiàn)不規(guī)范的問(wèn)題
// 抽象工廠模式
var AbstractFactory = function () {}
AbstractFactory.prototype = {
getName: function () {
throw new Error('抽象方法不能調(diào)用')
}
}
var aFactory = new AbstractFactory()
aFactory.getName() // Uncaught Error: 抽象方法不能調(diào)用
aFactory.getName = function () {
return "jack"
}
aFactory.getName() // "jack"
- 觀察者模式
概念:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新,又稱(chēng)作發(fā)布訂閱模式
使用場(chǎng)景:消息訂閱,事件監(jiān)聽(tīng)
function Publisher() {
this.observers = []
var state = {}
this.getState = function () {
return state
}
this.setState = function (newState) {
state = newState
this.notice()
}
}
Publisher.prototype.addObserver = function (newObserver) {
var isExist = false
for (var i = 0; i < this.observers.length; i++) {
if (newObserver === this.observers[i]) {
isExist = true
break
}
}
if (!isExist)
this.observers.push(newObserver)
return this
}
Publisher.prototype.removeObserver = function (targetObserver) {
for (var i = 0; i < this.observers.length; i++) {
if (targetObserver === this.observers[i]) {
this.observers.splice(i, 1)
break
}
}
return this
}
Publisher.prototype.notice = function () {
for (var i = 0; i < this.observers.length; i++) {
this.observers[i].update(this.getState())
}
}
function Observer() {
this.update = function (state) {
// ...
}
}
經(jīng)典應(yīng)用場(chǎng)景:實(shí)現(xiàn) nodejs 中的 EventEmitter