JavaScript是一種多范型的編程語言,提供了多種方式來實現面向對象編程,而工廠模式是其中最為常用的一種。工廠模式是一種創建型設計模式,它通過提供一個通用的接口來創建對象,而不需要知道具體的實現細節。
下面我們通過幾個例子來說明工廠模式的實際應用。
// 例1:工廠函數返回對象 function createPerson(name, age, gender) { return { name: name, age: age, gender: gender, sayName: function() { console.log('My name is ' + this.name + '.'); } }; } var person1 = createPerson('Tom', 25, 'Male'); person1.sayName(); // My name is Tom. var person2 = createPerson('Lily', 23, 'Female'); person2.sayName(); // My name is Lily.
在這個例子中,我們定義了一個名為createPerson的工廠函數,它通過返回一個對象來創建人物。我們只需要傳遞必要的參數(名稱、年齡、性別)就可以創建一個新的人物。
// 例2:構造函數返回對象 function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayName = function() { console.log('My name is ' + this.name + '.'); } } function createPerson(name, age, gender) { return new Person(name, age, gender); } var person1 = createPerson('Tom', 25, 'Male'); person1.sayName(); // My name is Tom. var person2 = createPerson('Lily', 23, 'Female'); person2.sayName(); // My name is Lily.
這個例子和前一個例子非常相似,唯一的區別是我們使用了構造函數來創建人物對象。同樣是通過一個通用接口來創建對象,只是具體實現不同而已。我們可以看到,使用構造函數和使用工廠函數是等效的。
// 例3:工廠函數返回構造函數 function createPersonClass() { return function(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayName = function() { console.log('My name is ' + this.name + '.'); } }; } var Person = createPersonClass(); var person1 = new Person('Tom', 25, 'Male'); person1.sayName(); // My name is Tom. var person2 = new Person('Lily', 23, 'Female'); person2.sayName(); // My name is Lily.
這個例子稍微有些不同,我們定義了一個名為createPersonClass的工廠函數,它返回了一個新的構造函數。在調用createPersonClass函數時,我們并沒有傳遞任何參數,因為它并不需要創建具體的人物對象。而是返回了一個函數,這個函數會根據傳入的參數創建人物對象。通過這種方式,我們可以創建一個通用的人物構造函數,而不需要重復地定義Person類。
// 例4:使用閉包實現私有變量 function createPerson(name, age, gender) { var privateVar = 0; function increasePrivateVar() { privateVar++; } return { name: name, age: age, gender: gender, sayName: function() { console.log('My name is ' + this.name + '.'); }, getPrivateVar: function() { return privateVar; }, increasePrivateVar: increasePrivateVar }; } var person1 = createPerson('Tom', 25, 'Male'); console.log(person1.getPrivateVar()); // 0 person1.increasePrivateVar(); console.log(person1.getPrivateVar()); // 1
最后,我們再來一個稍微有些復雜的例子,它演示了如何使用閉包來實現私有變量。在這個例子中,我們使用了一個內部函數increasePrivateVar來修改私有變量privateVar的值,并且通過getPrivateVar函數來獲取私有變量的值。這些函數都是作為返回的對象的屬性來定義的,因此它們能夠訪問私有變量。而且由于私有變量只在工廠函數內部定義,因此它們不會影響到其他的對象。
以上幾個例子顯示了工廠模式在JavaScript中的實際應用。它通過提供一個通用的接口,讓我們能夠使用更高的抽象層次來創建對象,而不需要關注具體的實現細節。使用工廠模式,我們可以更好地組織代碼,提高代碼的可讀性和可維護性。