Hỏi - đáp Nơi cung cấp thông tin nghề nghiệp và giải đáp những thắc mắc thường gặp của bạn

Một số design pattern các lập trình viên nên biết

Là một lập trình viên, nhiệm vụ của chúng ta là giải quyết các bài toán được đưa ra. Rất nhiều bài toán đã được giải quyết bởi các lập trình viên khác, vậy tại sao chúng ta cần giải quyết lại chúng. Chúng ta đều không muốn “phát minh lại bánh xe”. Design pattern sẽ giúp giải quyết vấn đề này. Hãy cùng tìm hiểu một số design pattern mà chúng ta nên biết thông qua các ví dụ để hiểu rõ hơn về chúng.

1. Singleton

  • Đây là design pattern được sử dụng khá phổ biến. Rất nhiều framwork sử dụng design pattern này. Pattern này được sử dụng khi ta muốn tạo một object từ một class và muốn chắc chắn rằng chỉ có một object được tạo từ nó. Implement cho design pattern này

Một construtor được khởi tạo private để tránh truy cập từ bên ngoài vào. Cũng cần phải tạo một biến static và method getInstance() đảm bảo rằng chỉ một instance của class được tạo ra.

2. Initialization On Demand Holder

Pattern này khá giống với Singleton bên trên nhưng nó có một ưu điểm hơn đó là khi là việc với thread thì pattern này sẽ giúp thread safe, trường hợp của singleton nếu không sử lý đồng bộ có thể tạo 2 instance khác nhau. Ví dụ với Initialization On Demand Holder như sau:

Đúng với cái tên của pattern này thì nó sẽ không khởi tạo của instance cho đến khi method getInstance() được gọi, với ưu điểm này thì nó giúp thread safe.

3. Strategy và factory pattern

  • 2 pattern này được sử dụng rất phổ biến, hãy xem xét ví dụ khi chúng được kết hợp cùng nhau

Nếu cần một loại building nào đấy, ta chỉ cần truyền vào loại và nó sẽ trả về object của loại đó hoặc null nếu như không có instance cho loại này, nó sẽ rất hữu ích trong trường hợp sử dụng đa hình.

4. Chain of responsibility

Khi build một ứng dựng với nhiều logic xử lý nghiệp vụ, có rất nhiều logic phức tạp đằng sau phải thực thi, sự phức tạp này có thể khiến code khó hiểu cũng như khó theo dõi, log bug … Pattern này sẽ giúp code của ta có thể được chia nhỏ thành từng phần và quản lý chúng theo từng bước tuần tự.

Chúng ta đã chia nhỏ code khi implement method của interface Commands và tách logic sử lý nó vào một chỗ. Ta cũng có thể sắp xếp lại code nếu muốn để làm code decoupled hơn.

5. Builder

  • Rất nhiều class khi tạo một object cần phải truyền vào rất nhiều tham số, trong trường hợp như vậy thì khi ta sử dụng contructor hoặc sử dụng get, set đều khiến code trở nên khá rối và dài dòng. Builder pattern sẽ giúp ta giải quyết vấn đề này. Hãy xem xét ví dụ