Chào Mừng Năm Mới và Giới Thiệu Về Factory Design Pattern
Trước khi bắt đầu, chúc tất cả các bạn trong cộng đồng một năm mới an khang, sức khỏe dồi dào và đạt nhiều thành công trong sự nghiệp cũng như cuộc sống! ❤️
Tổng Quan Về Factory Design Pattern
Factory Design Pattern là một trong những mẫu thiết kế thuộc nhóm Creational Design Pattern, giúp đơn giản hóa việc tạo đối tượng trong lập trình. Mẫu thiết kế này cung cấp một giao diện chung (có thể là Class hoặc hàm) nhằm tăng tính linh hoạt và khả năng mở rộng của ứng dụng.
Ví Dụ Minh Họa Cụ Thể
Để dễ hiểu hơn về Factory Design Pattern, chúng ta sẽ cùng xem qua một ví dụ cụ thể. Trong ví dụ này, chúng ta sẽ tạo hai lớp đối tượng là Cat
và Dog
, sau đó xây dựng một lớp Factory gọi là AnimalFactory
với phương thức create
nhằm tạo các đối tượng theo loại mà chúng ta muốn.
Bước 1: Tạo các lớp Cat và Dog
javascript
class Cat {
constructor(options) {
this.name = options.name;
}
}
class Dog {
constructor(options) {
this.name = options.name;
}
}
Bước 2: Tạo lớp AnimalFactory
javascript
class AnimalFactory {
create(type, options) {
if(type === 'cat') return new Cat(options);
else if(type === 'dog') return new Dog(options);
}
}
Sử Dụng AnimalFactory
javascript
var animalFactory = new AnimalFactory();
var dog = animalFactory.create('dog', {name: 'Pi'});
console.log(dog); // {name: 'Pi'}
Như vậy, việc tạo đối tượng giờ đây trở nên đơn giản hơn nhiều thông qua phương thức create
trong lớp AnimalFactory
. Tuy nhiên, một vấn đề phát sinh khi bạn muốn mở rộng và thêm loại đối tượng mới.
Vấn Đề Khi Mở Rộng
Khi cần thêm đối tượng Bird
, bạn sẽ phải chỉnh sửa lại phương thức create
trong lớp AnimalFactory
như sau:
javascript
class Bird {
constructor(options) {
this.age = options.age;
}
}
class AnimalFactory {
create(type, options) {
if(type === 'cat') return new Cat(options);
else if(type === 'dog') return new Dog(options);
else if(type === 'bird') return new Bird(options); // Thêm điều kiện cho Bird
}
}
Giải Pháp Hiệu Quả Hơn
Để tránh việc sửa đổi thường xuyên trong phương thức create
, chúng ta có thể sử dụng một đối tượng để quản lý việc ánh xạ các lớp.
javascript
var objectMapping = {
cat: Cat,
dog: Dog,
bird: Bird
}
class AnimalFactory {
create(type, options) {
let animal = objectMapping[type];
return new animal(options);
}
}
Với cách này, khi cần thêm một loại động vật mới, bạn chỉ cần thêm nó vào objectMapping
mà không cần chỉnh sửa phương thức create
. Phương pháp này giúp tuân thủ nguyên tắc Open/Closed Principle trong SOLID, nghĩa là phải mở để mở rộng và đóng để sửa đổi.
Ứng Dụng Mapping Trong JavaScript
Ngoài ra, bạn cũng có thể áp dụng cách viết ánh xạ tương tự trong việc xử lý nhiều điều kiện trong mã của mình. Ví dụ:
javascript
let objMapping = {
OrgID: {
Caption: 'Cơ cấu tổ chức',
ShortName: 'CCTC',
dataType: 1
},
JobID: {
Caption: 'Vị trí công việc',
dataType: 2
}
}
function handleMapping(o) {
if(objMapping[o.displayField]) {
o = {
...o,
...objMapping[o.displayField]
}
}
}
Với cách tiếp cận này, bạn không phải sửa đổi hàm handleMapping
mỗi khi thêm điều kiện ánh xạ mới, giúp mã nguồn trở nên dễ quản lý hơn.
Kết Luận
Áp dụng Factory Design Pattern giúp việc tạo đối tượng trở nên đơn giản và hiệu quả hơn. Hi vọng bài viết này đã mang đến cho bạn những kiến thức bổ ích về mẫu thiết kế này. Cảm ơn bạn đã theo dõi! 😊
source: viblo