我們在寫程式時,經常會碰到很類似的需求,每次都增加一些類似內容的程式碼,甚至可以用複製貼上後修改幾個小地方就能完成,漸漸的我們可以從這些程式碼當中發現是有規律的,只需要針對不同需求的地方作些微的調整,這樣就能套用下一次類似需求出現時的模式。
這樣的模式可以出現在很多場景,甚至在日常生活中處處可見,
例如: 早上起床刷牙洗臉 -> 吃早餐 -> 工作 -> 吃午餐 -> 工作 -> 吃晚餐 -> 工作看電視 -> 睡覺。
這就是一種模式,你也可以說,車子看到紅燈停、黃燈減速、綠燈行駛,這也算是一種模式。
總而言之,設計模式就是解決問題的方法,任何程式語言都可以應用設計模式的概念,去解決所遇到的問題,設計模式的目的在於降低程式之間的耦合度( decoupled )、提高彈性 ( flexibility )、擴展性 ( extensibility )。
由於設計模式種類非常多,這裡介紹九種比較常見的設計模式
在介紹單體模式之前,先來介紹一個小技巧,是為了預防忘記 new 而產生全域變數。
function CreateNumber(n) {
this.number = n;
}
var obj = CreateNumber(55); // 這裡忘記 new
console.log(obj.number); // Cannot read property 'number' of undefined
console.log(number); // 55 全域
function CreateNumber(n) {
if ( this instanceof CreateNumber ) {
this.number = n;
} else {
return new CreateNumber(n);
}
}
var obj = CreateNumber(55); // 這裡忘記 new
console.log(obj.number); // 55
console.log(number); //number is not defined
這邊我們使用到了 instanceof 來檢查我們設定的變數是否為 CreateNumber 的實例物件或建構函式,藉此判斷是否忘記 new 。
JavaScript 內建的 Array 和 Object 不需要使用 new 也一樣能產生物件。
之後的章節大概一天會介紹三個設計模式,預計在三天左右會介紹完,之後就要來談談 ES6 。
參考資料:
Tommy - 深入 JavaScript 核心課程
MDN - instanceof