Factory pattern (ok)
https://app.gitbook.com/@javascriptuse/s/advanced/chem-gio-ve-javascript-design-pattern-phan-2
Factory pattern
Mục đích của pattern này là tạo các object
Thực hiện các thao tác lặp lại khi tạo các đối tượng tương tự nhau
Cung cấp các phương thức để tạo object mà không cần biết kiểu tạo thời điểm biên dịch
Hãy xem ví dụ sau
Constructor CarMaker
Car Maker có static method factory() để tạo các car objects
Constructor đặc biệt như CarMaker.Compact, CarMaker.SUV, and CarMaker.Convertible kế thừa CarMaker. Tất cả constructor trên được định nghĩa như static – properties
Bạn sẽ implement như sau
var corolla = CarMaker.factory('Compact');
var solstice = CarMaker.factory('Convertible');
var cherokee = CarMaker.factory('SUV');
corolla.drive(); // "Vroom, I have 4 doors"
solstice.drive(); // "Vroom, I have 2 doors"
cherokee.drive(); // "Vroom, I have 17 doors"
Trong đoạn code trên, đây là phần cần chú ý nhất
var corolla = CarMaker.factory('Compact');
Bạn chỉ cần truyền tham số vào method factory, CarMaker sẽ trả về object tương ứng. Như vậy bạn không cần phải dùng từ khóa new để tạo object, chỉ cần dùng method để tạo object dựa vào tham số truyền vào
Dưới đây là toàn bộ source code đầy đủ
// parent typeuctor
function CarMaker() {}
// a method of the parent
CarMaker.prototype.drive = function() {
return "Vroom, I have " + this.doors + " doors";
};
// the static factory method
CarMaker.factory = function(type) {
var newcar;
// error if the typeuctor doesn't exist
if (typeof CarMaker[type] !== "function") {
throw {
name: "Error",
message: type + " doesn't exist"
};
}
// at this point the typeuctor is known to exist
// let's have it inherit the parent but only once
if (typeof CarMaker[type].prototype.drive !== "function") {
CarMaker[type].prototype = new CarMaker();
}
// create a new instance
newcar = new CarMaker[type]();
// optionally call some methods and then return...
return newcar;
};
// define specific car makers
CarMaker.Compact = function() {
this.doors = 4;
};
CarMaker.Convertible = function() {
this.doors = 2;
};
CarMaker.SUV = function() {
this.doors = 24;
};
var corolla = CarMaker.factory('Compact');
var solstice = CarMaker.factory('Convertible');
var cherokee = CarMaker.factory('SUV');
corolla.drive(); // "Vroom, I have 4 doors"
solstice.drive(); // "Vroom, I have 2 doors"
cherokee.drive(); // "Vroom, I have 17 doors"
Last updated