設計模式(5)[JS版]-JavaScript如何實現工廠方法模式?
目錄
1 什么是工廠方法模式?
2?工廠方法模式作用
3?工廠方法模式參與者
4 代碼實現
1 什么是工廠方法模式?
在基于類的編程中,工廠方法模式是一種創建模式,該模式使用工廠方法來處理創建對象的問題,而不必指定將要創建的對象的確切類。這是通過調用工廠方法來創建對象的,而不是通過調用構造函數,該工廠方法在接口中指定并由子類實現,或者在基類中實現,并且可以選擇由派生類覆蓋。它提供了一種將實例化邏輯委托給子類的方法。
工廠方法按照客戶端的指示創建新對象。在JavaScript中創建對象的一種方法是使用new運算符調用構造函數。但是,在某些情況下,客戶端不知道或者不應該知道要實例化的幾個候選對象之一。工廠方法允許客戶端委托對象創建,同時仍保留對實例化哪種類型的控制。
工廠方法的主要目標是可擴展性。工廠方法經常用在管理,維護或操作對象集合的應用程序中,這些對象集合雖然不同,但同時具有許多共同的特征(即方法和屬性)。例如混合了Xml文檔,Pdf文檔和Rtf文檔的文檔集合。
2?工廠方法模式作用
當類中有一些通用處理,但所需的子類在運行時動態確定時才能確定時,我們可以用工廠方法模式。或者換句話說,當客戶端不知道它可能需要什么確切的子類時,我們這時候就需要使用工廠方法模式。
3?工廠方法模式參與者
工廠方法模式參與者主要有:
Create?:
1 創造新產品的“工廠”對象
2. 實現“ factoryMethod”,該方法返回新創建的產品
AbstractProduct:
1. 聲明產品的接口
2?在JavaScript中不使用
ConcreteProduct:
1 正在創建的產品
2 所有產品都擁有相同的接口(相同的屬性和方法)
4 代碼實現
在下面的例子中,工廠對象創建了四種不同類型的員工,每種員工類型都有不同的時薪。createEmployee方法是實際的工廠方法。客戶端通過向工廠方法傳遞一個類型參數來告訴工廠需要創建什么類型的員工。
因為Javascript不支持抽象類或接口,所以AbstractProduct沒有實現。但是,我們仍然需要確保所有員工類型都有相同的接口(屬性和方法)。
在run函數中我們創建了四個不同的員工類型;所有的員工類型都存儲在同一個數組中。每個員工都要說出他們是什么類型的員工和他們的時薪。日志函數用來收集和顯示結果。
//工廠類
function Factory() {
//創建員工的工廠方法
this.createEmployee = function(type) {
var employee;
if (type === "全職員工") {
employee = new FullTime();
} else if (type === "兼職員工") {
employee = new PartTime();
} else if (type === "臨時工") {
employee = new Temporary();
} else if (type === "包工頭") {
employee = new Contractor();
}
employee.type = type;
employee.say = function() {
log.add('我是' + this.type + ',時薪:' + this.hourly + '/小時');
}
return employee;
}
}
//全職員工
var FullTime = function() {
this.hourly = "12元";
};
//兼職員工
var PartTime = function() {
this.hourly = "11元";
};
//臨時工
var Temporary = function() {
this.hourly = "10元";
};
//包工頭
var Contractor = function() {
this.hourly = "15元";
};
// 日志函數
var log = (function() {
var log = "";
return {
add: function(msg) {
log += msg + "\n";
},
show: function() {
console.log("%c%s", "color: red; font-size: 20px", log);
log = "";
}
}
})();
function run() {
var employees = [];
var factory = new Factory();
employees.push(factory.createEmployee("全職員工"));
employees.push(factory.createEmployee("兼職員工"));
employees.push(factory.createEmployee("臨時工"));
employees.push(factory.createEmployee("包工頭"));
for (var i = 0, len = employees.length; i < len; i++) {
employees[i].say();
}
log.show();
}
run();
JavaScript
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。