Giới Thiệu

Design patterns là những giải pháp có thể tái sử dụng cho các vấn đề phổ biến trong thiết kế phần mềm. Chúng đại diện cho những phương pháp tốt nhất đã được phát triển theo thời gian bởi các nhà phát triển phần mềm có kinh nghiệm. Loạt bài này khám phá các design patterns khác nhau được triển khai trong JavaScript và TypeScript, cung cấp các ví dụ thực tế và trường hợp sử dụng.

Các Loại Design Patterns

Design patterns thường được phân loại thành ba nhóm chính:

  • Creational Patterns: Tập trung vào cơ chế tạo đối tượng
  • Structural Patterns: Liên quan đến cấu trúc và mối quan hệ giữa các đối tượng
  • Behavioral Patterns: Liên quan đến tương tác và trách nhiệm giữa các đối tượng

Ngoài ra, chúng ta sẽ khám phá các patterns hiện đại trong JavaScript/TypeScript, functional programming patterns, và asynchronous patterns.

Mối Quan Hệ Giữa Các Design Patterns

Biểu đồ sau đây thể hiện mối quan hệ và sự liên kết giữa các design patterns chính:


  ---
config:
  layout: elk
  elk:
    mergeEdges: true
    nodePlacementStrategy: LINEAR_SEGMENTS
---
graph TD
    %% Group Traditional Patterns
    subgraph A[Traditional Patterns]
        B[Creational Patterns]
        C[Structural Patterns]
        D[Behavioral Patterns]


        %% Creational Patterns
        B --> B1[Singleton]
        B --> B2[Factory Method]
        B --> B3[Abstract Factory]
        B --> B4[Builder]
        B --> B5[Prototype]
        B --> B6[Module]

        %% Structural Patterns
        C --> C1[Adapter]
        C --> C2[Bridge]
        C --> C3[Composite]
        C --> C4[Decorator]
        C --> C5[Facade]
        C --> C6[Flyweight]
        C --> C7[Proxy]

        %% Behavioral Patterns
        D --> D1[Observer]
        D --> D2[Strategy]
        D --> D3[Command]
        D --> D4[Iterator]
        D --> D5[Mediator]
        D --> D6[State]
        D --> D7[Chain of Responsibility]
        D --> D8[Memento]
        D --> D9[Template Method]
        D --> D10[Visitor]
        D --> D11[Interpreter]
    end

    %% Modern JS/TS Patterns
    E[Modern JS/TS Patterns]
    E --> E1[Dependency Injection]
    E --> E2[MVVM & MVC]
    E --> E3[Repository]
    E --> E4[Mixin]

    %% Functional Patterns
    F[Functional Patterns]
    F --> F1[Monads]
    F --> F2[Functors]
    F --> F3[Function Composition]
    F --> F4[Currying & Partial Application]

    %% Asynchronous Patterns
    G[Asynchronous Patterns]
    G --> G1[Promises & Async/Await]
    G --> G2[Reactive Patterns]
    G --> G3[Polling vs WebSockets]
    G --> G4[Pub-Sub]

    %% Relationships between patterns with descriptions
    B2 -.-> |"Mở rộng thành"|B3[Abstract Factory]
    B4 -.-> |"Có thể sử dụng"|B5[Prototype]
    C4 -.-> |"Thường kết hợp với"|D3[Command]
    C5 -.-> |"Thường sử dụng"|B1[Singleton]
    C6 -.-> |"Thường sử dụng"|B1[Singleton]
    C7 -.-> |"Tương tự nhưng mục đích khác"|C4[Decorator]
    D1 -.-> |"Có thể kết hợp với"|D5[Mediator]
    D3 -.-> |"Có thể được triển khai bằng"|D7[Chain of Responsibility]
    D6 -.-> |"Tương tự nhưng tập trung vào trạng thái"|D2[Strategy]
    D2 -.-> |"Thường được sử dụng trong"|D9[Template Method]
    E1 -.-> |"Thường sử dụng"|B2[Factory Method]
    E3 -.-> |"Có thể được triển khai bằng"|C7[Proxy]
    F1 -.-> |"Loại đặc biệt của"|F2[Functors]
    F1 -.-> |"Hỗ trợ"|F3[Function Composition]
    G1 -.-> |"Nền tảng của"|G2[Reactive Patterns]
    G2 -.-> |"Có nền tảng từ"|D1[Observer]
    G4 -.-> |"Liên quan đến"|D1[Observer]


    %% Style
    classDef category fill:#ccc,stroke:#fff,stroke-width:2px
    classDef creational fill:#ffcccc,stroke:#cc0000,stroke-width:2px
    classDef structural fill:#ccffcc,stroke:#008000,stroke-width:2px
    classDef behavioral fill:#ccccff,stroke:#0000cc,stroke-width:2px
    classDef modern fill:#ffcc99,stroke:#ff6600,stroke-width:2px
    classDef functional fill:#ffff99,stroke:#999900,stroke-width:2px
    classDef async fill:#99ccff,stroke:#0066cc,stroke-width:2px
    classDef relationship stroke-dasharray: 5 5,color:#888

    style A fill:#e6e6e6,stroke:#666,stroke-width:3px,rx:10px,ry:10px
    class B,C,D category
    class B1,B2,B3,B4,B5,B6 creational
    class C1,C2,C3,C4,C5,C6,C7 structural
    class D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 behavioral
    class E1,E2,E3,E4 modern
    class F1,F2,F3,F4 functional
    class G1,G2,G3,G4 async

Creational Patterns

Creational patterns cung cấp các cơ chế tạo đối tượng khác nhau để tăng tính linh hoạt và tái sử dụng mã hiện có.

Structural Patterns

Structural patterns giải thích cách tổ chức các đối tượng và lớp thành các cấu trúc lớn hơn trong khi vẫn giữ cho các cấu trúc này linh hoạt và hiệu quả.

Behavioral Patterns

Behavioral patterns liên quan đến các thuật toán và việc phân công trách nhiệm giữa các đối tượng.

Modern JavaScript/TypeScript Patterns

Các patterns đã phát triển cùng với các phương pháp phát triển hiện đại trong JavaScript và TypeScript.

Functional Programming Patterns

Các patterns có nguồn gốc từ lập trình hàm (functional programming) có thể áp dụng trong JavaScript và TypeScript.

Asynchronous Patterns

Các patterns để xử lý các hoạt động bất đồng bộ trong JavaScript và TypeScript.