JavaScript Design Patterns: Module và Singleton
Module Pattern
Trước ES6: IIFE
var Counter = (function() {
var count = 0; // Private
return {
increment: function() {
count++;
return count;
},
getCount: function() {
return count;
}
};
})();
console.log(Counter.increment()); // 1
console.log(Counter.getCount()); // 1
// count không truy cập được từ ngoài!
ES6 Modules
// utils.js
let count = 0;
export const increment = () => count++;
export const getCount = () => count;
// main.js
import { increment, getCount } from './utils.js';
Singleton Pattern
Đảm bảo chỉ có một instance duy nhất của object.
const Database = (function() {
let instance;
function createInstance() {
return {
connect: () => console.log('Connected to DB'),
query: (sql) => console.log('Query:', sql)
};
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const db1 = Database.getInstance();
const db2 = Database.getInstance();
console.log(db1 === db2); // true - cùng một instance!
Factory Pattern
function createUser(type) {
switch(type) {
case 'admin':
return { role: 'admin', permissions: ['read', 'write', 'delete'] };
case 'user':
return { role: 'user', permissions: ['read'] };
default:
return { role: 'guest', permissions: [] };
}
}
Kết luận
Design patterns giúp:
- Tổ chức code tốt hơn
- Tránh global scope pollution
- Dễ maintain và test
- Reusable code
Dù JavaScript rất linh hoạt, áp dụng patterns đúng cách sẽ giúp project scale tốt hơn.
