Design Pattern là những mẫu thiết kế về code được đúc kết từ những lâp trình viên đi trước trong quá trình làm việc với ngôn ngữ lập trình và Hướng Đối Tượng. Hiểu và được áp dụng thích hợp các mẫu Design Pattern cũng là một bước quan trọng trong việc áp dụng Hướng Đối Tượng cho việc thiết kế và viết chương trình Java. Hãy cùng nhau tìm hiểu.

1. Giới thiệu:

Khái niệm của Design Pattern rất rộng lớn tương ứng với các loại hình thiết kế chương trình khác nhau và ngôn ngữ lập trình khác nhau. Ví dụ: chúng ta có Design Pattern của ngôn ngữ C, C++ khác với Design Pattern Hướng Đối Tượng mà ngôn ngữ lập trình được áp dụng là Java hay C#, ... Trong giới hạn của (các) bài viết này The Code Root sẽ tập trung vào các Pattern của ngôn ngữ lập trình Java.

Vào năm 1994, một nhóm gồm 4 lập trình viên là Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides đã phát hành quyển sách "Design Patterns - Elements of Reusable Object-Oriented Software" đưa ra những khái niệm ứng dụng đầu tiên về Design Pattern trong thiết kế và phát triển phần mềm. Mục đích ban đầu được ra của Design Pattern được ứng dụng cho tới tận ngày nay với 2 mục đích chính:

  • Tạo một chuẩn phát triển chung cho tất cả developer:
  • Tái sử dụng những mẫu code đã được chỉnh sửa, đúc kết ra từ những vấn đề đã được giải quyết và rút kinh nghiệm

Nhìn chung lại nền tảng tư tưởng của Design Patter chính là muốn hướng các developer tái sử dụng lại những kinh nghiệm đã được rút đó để tạo sự thống nhất khi thiết kế và viết chương trình Java để trước tiên tạo nên những chương trình không những có chức năng hoạt động đúng theo yêu cầu mà còn phải có cấu trúc mã nguồn (code structure) chỉn chu để những thành viên khác có thể nắm bắt và có thể chỉnh sửa lỗi hoặc cập nhật thêm chức năng dễ dàng hơn.

Design Patern có khó không ?

Design Patter tất nhiên là không khó bởi vì nó được tạo ra như một "ngôn ngữ chung" cho các Developer mà cụ thể ở đây là các Java Developer nên chúng ta có thể tự tin rằng hoàn toàn có thể hiểu và ứng dụng được Design Pattern vào công việc thực tế.

Tin chắc rằng rất nhiều bạn sinh viên hoặc cả những bạn đã ra trường đi làm được một vài năm vẫn luôn có câu hỏi này trong đầu ? Thậm chi là các bạn từng hoài nghi: "Học Design Pattern để làm gì trong khi  mình đã code được rồi ?" Với vai trò là một người học lập trình Java muốn tìm hiểu về những khái niệm của Design Pattern, người viết luôn ưu tiên những tài liệu Tiếng Việt trước để ... tiết kiệm thời gian, nhưng những bạn có nhiều kinh nghiệm trong việc tìm kiếm tài liệu online, việc làm này luôn là một con dao hai lưỡi bởi vì: Không phải tài liệu nào cũng được viết từ kinh nghiệm thật sự, một số được dịch hời hợt từ tài liệu gốc bằng Tiếng Anh, một số còn tệ hơn được tạo nên bằng cách chắp vá từ những bài dịch trên. Tất nhiên vẫn có những bài viết chất lượng được đúc kết và giản lược từ những kinh nghiệm thực tế từ những người viết có tâm - có kiến thức và có tâm huyết truyền tải kiến thức, nhưng đâu đó chúng ta vẫn chưa có một Hệ thống bài viết được chuẩn chỉnh. 

2. Các nhóm mẫu Design Pattern:

Có rất nhiều mẫu Design Pattter dành cho lập trình viên Java và qua thời gian với cùng với những dự án và những vấn đề khó khăn được giải quyết, số lượng của chúng ngày một tăng lên. Tuy nhiên quy tựu lại tất cả các Design Pattern (Types of Design Pattern) hiện nay được chia thành 4 nhóm, trong bài viết này chủ yếu chúng ta sẽ chỉ đi vào những khái niệm sơ lược nhất. Qua những bài sau The Code Root sẽ lần lượt đi vào những nhóm Design Pattern, đưa ra ví dụ và phân tích những trường hợp nào nên sử dụng.

2.1 Creational Patterns

Một cách đơn giản chúng ta có thể hiểu rằng trong code chúng ta sẽ không sử dụng toán tử new để tạo mới một object mà sẽ tạo ra 1 class hay 1 package chuyên để quản lý việc tạo mới những đối tượng. Làm tốt điều này chúng ta sẽ dễ dàng hơn trong việc bảo trì code, chỉnh sửa những logic tạo mới này, chỉ phải đi chỉnh sửa một số nơi tập trung logic mà không phải dò lại toàn bộ code. Ví dụ đối với những Exception: chúng ta sẽ tạo ra cơ chế throw cho method hoặc tạo mới từ các message được quản lý tập trung.

Một số mẫu Creational thông dụng: Abstract Factory, Singleton, Factory Method, Builder, Prototype, ...

 

2.2 Structural Patterns

Những pattern trong Group này chủ yếu tập trung vào việc xây dựng mối quan hệ giữa các class với nhau (Class and Object composition) để cùng nhau thực hiện một chức năng nào đó trong chương trình. 

Một số mẫu thông dụng: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, ...

2.3 Behavioral Patterns

Ngược lại với cấu trúc của nhóm trên, các pattern trong mẫu này lại tập trung vào việc cách communication giữa các class có thể không có quan hệ kế thừa với nhau, ví dụ quan hệ giữa các tầng xử lý với nhau, sau khi controller tiếp nhận sẽ chuyển giao cho tầng service, tầng service lại liên lạc với các tầng DB hoặc tầng nghiệp vụ, .. để cùng nhau làm thành 1 chức năng hoàn chỉnh.

Một số mẫu thông dụng: Command, Interpretter, 

 

2.4 J2EE Patterns

Các mẫu pattern này được Sun Microsystem đưa từ những năm 90, những mẫu này không dành cho lập trình viên ứng dụng thông thường mà chủ yếu được các doanh nghiệp lớn ứng dụng cho nền tảng J2EE như Jboss, Glassfish, ...  Nhóm này chúng ta chỉ biết đến mức độ là có sự tồn tại của nó. Trong những bài viết sau The Code Root sẽ gửi đến các bạn những ví dụ mẫu và cách thức ứng dụng một số mẫu thông dụng.

Chúc các bạn thành công.

AutoCode.VN

minhnhatict@gmail.com Java Programming