---
description: >-
  https://app.gitbook.com/@javascriptuse/s/advanced/design-pattern-trong-javascript
---

# Factory Pattern (ok)

`Factory Pattern` là một pattern sử dụng phương thức đặc biệt để tạo các object mà không cần chỉ định rõ chính xác class hay constructor nào,

Pattern này có ích trong trường hợp chúng ta cần khởi tạo nhiều loại object phụ thuộc vào một số điều kiện nhất định. Ví dụ:

```
class VehicleFactory {
  createVehicle(options) {
    if (options.vehicleType === 'car') {
      return new Car(options);
    } else if (options.vehicleType === 'truck') {
      return new Truck(options);
    }
  }
}
class Car {
  constructor(options) {
    this.door = options.doors || 4;
    this.state = options.state || 'brand new';
    this.color = options.color || 'white';
  }
}
class Truck {
  constructor(options) {
    this.doors = options.doors || 4;
    this.state = options.state || 'used';
    this.color = options.color || 'black';
  }
}
var vehicle = new VehicleFactory().createVehicle({vehicleType: "car",doors:"Door"});
console.log(vehicle);// Car {door: "Door", state: "brand new", color: "white"}
```

Ở đây chúng ta tạo các class `Car` và `Truck` (với một vài giá trị mặc định) là nguyên mẫu cho các object. Sau đó định nghĩa thêm class `VehicleFactory` có nhiệm vụ khởi tạo và trả về một trong hai object ở trên dựa vào thuộc tính `vehicleType` trong `options`

```
const factory = new VehicleFactory();
const car = factory.createVehicle({
    vehicleType: 'car',
    doors: 4,
    color: 'silver',
    state: 'Brand New'
});
const truck = factory.createVehicle({
    vehicleType: 'truck',
    doors: 2,
    color: 'white',
    state: 'used'
});
// Prints Car {doors: 4, state: "Brand New", color: "silver"}
console.log(car);
// Prints Truck {doors: 2, state: "used", color: "white"}
console.log(truck);
```

Tạo một object `factory` từ class `VehicleFactory`. Sau đó chúng ta tạo một object của `Car` hoặc `Truck` bằng hàm `factory.createVehicle` và truyền object `options` là tham số bao gồm thuộc tính `vehicleType` là `car` hoặc `truck`.
