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

Tram Ho

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.

.u91cb6a7d7570f11f977f8eb829fc6180 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u91cb6a7d7570f11f977f8eb829fc6180:active, .u91cb6a7d7570f11f977f8eb829fc6180:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u91cb6a7d7570f11f977f8eb829fc6180 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u91cb6a7d7570f11f977f8eb829fc6180 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u91cb6a7d7570f11f977f8eb829fc6180 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u91cb6a7d7570f11f977f8eb829fc6180:hover .postTitle { text-decoration: underline!important; }

  Design Pattern – Builder

.ua7f979b0467a6c62a1496a90927827bd { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .ua7f979b0467a6c62a1496a90927827bd:active, .ua7f979b0467a6c62a1496a90927827bd:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .ua7f979b0467a6c62a1496a90927827bd { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .ua7f979b0467a6c62a1496a90927827bd .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .ua7f979b0467a6c62a1496a90927827bd .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .ua7f979b0467a6c62a1496a90927827bd:hover .postTitle { text-decoration: underline!important; }

  Design Patterns – Object Pool

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ụ

6. Template method

Pattern này được áp dụng trong trường hợp chúng ta có nhiều method chung nhưng khác nhau về hành vi của chúng, pattern này thì hoàn toàn dựa trên tính đa hình.

7. State

  • Rất nhiều object có trạng thái riêng của chúng. Ví dụ như đài radio có 2 trạng thái là bật(on) và tắt(off). Chúng ta sẽ biểu diễn nó dưới dạng hướng đối tượng

Ví dụ trên có thể đơn giản nhưng trong trường hợp có nhiều trạng thái có thể sẽ giúp ích rất tốt, ví dụ chúng ta có thể đặt điều kiện cho trạng thái, một trạng thái được chuyển khi một trạng thái khác được thực thi, ví dụ trong trường hợp trên là trạng thái on chỉ được thực thi khi đã có trạng thái off nếu không sẽ có ngoại lệ được bắn ra, ta cũng có thể thực thi bất kỳ nghiệp vụ nào mà ta muốn.

8. Kết luận

Trên đây là những kiến thức tìm hiểu về một số pattern hữu ích thông qua các ví dụ. Hi vọng bài viết sẽ có ích cho mọi người.

Reference

https://medium.com/educative/the-7-most-important-software-design-patterns-d60e546afb0e http://www.thedevpiece.com/design-patterns-that-every-developer-should-know/ https://www.tutorialspoint.com/design_pattern/index.htm

.u3af9aba3966c985912c41d6df8d47339 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u3af9aba3966c985912c41d6df8d47339:active, .u3af9aba3966c985912c41d6df8d47339:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u3af9aba3966c985912c41d6df8d47339 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u3af9aba3966c985912c41d6df8d47339 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u3af9aba3966c985912c41d6df8d47339 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u3af9aba3966c985912c41d6df8d47339:hover .postTitle { text-decoration: underline!important; }

  Giới thiệu ngắn gọn về Design Patterns trong phát triển Web

.u170053f1ebb11e91216052b1246d2378 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u170053f1ebb11e91216052b1246d2378:active, .u170053f1ebb11e91216052b1246d2378:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u170053f1ebb11e91216052b1246d2378 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u170053f1ebb11e91216052b1246d2378 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u170053f1ebb11e91216052b1246d2378 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u170053f1ebb11e91216052b1246d2378:hover .postTitle { text-decoration: underline!important; }

  Tổng quan các mẫu Design Pattern

Chia sẻ bài viết ngay

Nguồn bài viết : viblo