---
description: >-
  https://app.gitbook.com/@javascriptuse/s/advanced/chem-gio-ve-javascript-design-pattern-phan-2
---

# Factory pattern (ok)

#### **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&#x20;

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"
```
