Bạn có bao giờ nhìn lại code của mình từ 6 tháng trước rồi tự hỏi sao sửa cái gì cũng vỡ cái khác không? Mình cứ gặp đi gặp lại mấy vấn đề cấu trúc giống nhau qua nhiều project, cho đến khi nhận ra phần lớn chúng đều có giải pháp sẵn — design pattern.
Mình tổng hợp series này từ nhiều nguồn (chủ yếu Viblo) để hệ thống lại kiến thức cho bản thân. Tất cả ví dụ dùng TypeScript. Trong hơn 250 mẫu mà Gang of Four thống kê, khoảng 26 mẫu là đủ cho phần lớn tình huống thực tế. Bản chất đơn giản: tách các phần khó mở rộng ra thành đối tượng độc lập, rồi cấu trúc lại sao cho thay đổi sau này không lan ra khắp nơi.
Lưu ý: Design Pattern không phải thuật toán, cũng không phải component.
| Creational | Structural | Behavioral |
|---|---|---|
| Singleton | Adapter/ Wrapper | Chain of Responsibility |
| Factory | Bridge | Command |
| Method Factory | Composite | Mediator |
| Abstract Factory | Decorator | Memento |
| Builder | Facade | Observer |
| Object Pool | Proxy | Strategy |
| Prototype | Flyweight | Visitor |
| Dependency Injection | Delegation | State |
| Entity-Attribute-Value (EAV) | Repository |
Một số pattern mình bỏ đi:
- Template Method: Thực chất chỉ là kế thừa khi code đã clean. Không có gì đặc biệt.
- Null Object: Do class con không chỉ triển khai khung xương từ class cha mà còn mở rộng thêm phương thức riêng, nên null object phải tạo cho từng loại class. Làm việc mở rộng khó hơn thay vì dễ hơn.