Trong lĩnh vực phát triển phần mềm, việc hiểu rõ và ứng dụng thành thạo các Design Pattern là một yếu tố quan trọng quyết định đến chất lượng và khả năng mở rộng của hệ thống.Đề tài này
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI PHÂN HIỆU TP.HCM
BỘ MÔN CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP LỚN
MÔN: CHUYÊN ĐỀ CÔNG NGHỆ PHẦN MỀM
ĐỀ TÀI: Tìm hiểu về 3 trong 23 mẫu Design Pattern
và xây dựng ứng dụng minh họa
Sinh viên thực hiện:
1 Nguyễn Ngọc Lễ 6151071064
2 Trương Quang Duy 6151071039
3 Nguyễn Đình Hoàng Tuấn 6151071112
Giảng viên hướng dẫn: ThS.Trần Phong Nhã
TP.Hồ Chí Minh, Tháng 11 Năm 2023
Trang 3LỜI MỞ ĐẦU
1 TỔNG QUAN
Design Pattern, hay mẫu thiết kế, là những giải pháp chung cho những vấn đề phổ biến trong thiết kế phần mềm Chúng giúp tăng tính linh hoạt, tái sử dụng và bảo trì của mã nguồn Trong lĩnh vực phát triển phần mềm, việc hiểu rõ và ứng dụng thành thạo các Design Pattern là một yếu tố quan trọng quyết định đến chất lượng
và khả năng mở rộng của hệ thống
Đề tài này tập trung vào việc tìm hiểu về ba trong số 23 mẫu Design Pattern phổ biến nhất và xây dựng ứng dụng minh họa để thấy rõ sức mạnh và linh hoạt của chúng trong thực tế
2 MỤC TIÊU NGHIÊN CỨU
Mục tiêu của nghiên cứu này là:
Hiểu rõ ba Design Pattern được chọn và vận dụng chúng vào thiết kế phần mềm Xây dựng ứng dụng minh họa để làm rõ cách mỗi Design Pattern được sử dụng và ảnh hưởng của chúng đối với cấu trúc và hoạt động của hệ thống
Đánh giá hiệu suất và tính linh hoạt của các Design Pattern thông qua việc so sánh
và phân tích kết quả ứng dụng
3 CẤU TRÚC BÁO CÁO
Báo cáo này được chia thành các phần chính như sau:
Chương 1: Giới Thiệu về Design Pattern
Định nghĩa và vai trò của Design Pattern
Ý nghĩa và lợi ích khi sử dụng Design Pattern trong phát triển phần mềm
Chương 2: Tìm Hiểu về Ba Design Pattern Chọn Lựa
Trình bày chi tiết về ba Design Pattern được chọn, bao gồm mô tả, cấu trúc, và cách sử dụng
Chương 3: Xây Dựng Ứng Dụng Minh Họa
Mô tả kiến trúc tổng quan của ứng dụng minh họa
Hướng dẫn cụ thể về cách mỗi Design Pattern được áp dụng trong ứng dụng
Chương 4: Đánh Giá và So Sánh Kết Quả
Phân tích hiệu suất và tính linh hoạt của ba Design Pattern thông qua kết quả thực nghiệm
Trang 4Chương 5: Kết Luận và Hướng Phát Triển
Tóm tắt kết quả đạt được
Đề xuất hướng phát triển và nghiên cứu tương lai
Chúng ta sẽ bắt đầu với Chương 1, giới thiệu về Design Pattern và vai trò quan trọng của chúng trong phát triển phần mềm
Trang 5CHƯƠNG 1: GIỚI THIỆU VỀ DESIGN PATTERN
1.1 Định nghĩa và vai trò của Design Pattern.
Design pattern là các giải pháp tổng thể đã được tối ưu hóa, được tái sử dụng cho các vấn đề phổ biến trong thiết kế phần mềm mà chúng ta thường gặp phải hàng ngày
Design patterns là một kỹ thuật trong lập trình hướng đối tượng, không phải là ngôn ngữ cụ thể nào cả, nó là một kĩ thuật lập trình Nó có thể thực hiện được ở phần lớn các ngôn ngữ lập trình, chẳng hạn như Java, C#, thậm chí là Javascript hay bất kỳ ngôn ngữ lập trình nào khác Nó khá quan trọng và mọi lập trình viên muốn giỏi đều phải biết, nó cung cấp cho bạn các “mẫu thiết kế”, giải pháp để giải quyết các vấn đề chung, thường gặp trong lập trình Các vấn đề mà bạn gặp phải
có thể bạn sẽ tự nghĩ ra cách giải quyết nhưng có thể nó chưa phải là tối ưu Design Pattern giúp bạn giải quyết vấn đề một cách tối ưu nhất, cung cấp cho bạn các giải pháp trong lập trình OOP Tuy nhiên, nếu bạn là “newbie” – người mới tìm hiểu về lập trình, chưa nắm rõ kiến thức về OOP thì giờ chưa phải lúc các bạn chơi với Design Pattern Muốn học Design Pattern, bạn cần phải có kiến thức vững chắc về lập trình, đặc biệt là lập trình OOP Hiểu và áp dụng được kiến thức
về OOP sẽ giúp bạn tiếp cận và nâng cao trình độ với Design Pattern dễ dàng và hiệu quả hơn
1.2 Ý nghĩa và lợi ích khi sử dụng Design Pattern trong phát triển phần mềm.
Tăng tốc độ phát triển phần mềm
Trong quá trình phát triển ứng dụng, việc sử dụng design patterns cho phép các developers
có một công cụ để giải quyết các vấn đề thông dụng trong thiết kế phần mềm Kể cả khi không gặp phải những vấn đề đó, việc nắm vững design patterns cũng rất hữu ích khi nó giúp developers thấy được cách giải quyết vấn đề thông qua việc ứng dụng các nguyên tắc thiết kế hướng đối tượng
Code tường minh, dễ dàng team work
Bên cạnh đó, design patterns định nghĩa một ngôn ngữ chung mà developers có thể dùng
để giao tiếp hiệu quả hơn Chẳng hạn, chỉ cần nêu tên một pattern, tất cả những đồng đội trong nhóm đều sẽ hình dung được cấu trúc, ý tưởng đằng sau đó và cách ứng dụng nó Tối ưu thời gian phát triển ý tưởng hơn vì hạn chế được thời gian giải thích
Tái sử dụng code
Về phía dự án phần mềm, design patterns giúp developers có thể dễ dàng tái sử dụng và
mở rộng code với các giải pháp tối ưu đã được kiểm chứng để giải quyết những vấn đề thông thường trong phát triển phần mềm Do đó, khi gặp vấn đề trong xây dựng phần
Trang 6mềm, developers có thể coi design patterns như là kim chỉ nam để giúp mình giải quyết những vấn đề thay vì tự đi tìm kiếm giải pháp (mà có thể chưa có sự kiểm chứng kĩ càng)
Hạn chế lỗi tiềm ẩn, dễ dàng nâng cấp
Ngoài ra, việc sử dụng lại các design patterns còn giúp developers tránh các vấn đề tiềm
ẩn có thể sẽ gây ra những lỗi lớn trong tương lai, cùng với đó, điều đó cũng giúp dự án dễ nâng cấp và bảo trì trong tương lai hơn
CHƯƠNG 2: TÌM HIỀU VỀ BA DESIGN PATTER
2.1Singleton Pattern:
1.Định nghĩa:
Singleton là 1 trong 5 design pattern của nhóm Creational Design Pattern
Singleton đảm bảo chỉ duy nhất một thể hiện (instance) được tạo ra và nó sẽ cung cấp cho bạn một method để có thể truy xuất được thể hiện duy nhất đó mọi lúc mọi nơi trong chương trình
Sử dụng Singleton khi chúng ta muốn:
Đảm bảo rằng chỉ có một instance của lớp
Việc quản lý việc truy cập tốt hơn vì chỉ có một thể hiện duy nhất
Có thể quản lý số lượng thể hiện của một lớp trong giớn hạn chỉ định
2.
Implement Singleton Pattern như thế nào?
Có rất nhiều cách để implement Singleton Pattern Nhưng dù cho việc implement bằng cách nào đi nữa cũng dựa vào nguyên tắc dưới đây cơ bản dưới đây:
Trang 7private constructor để hạn chế truy cập từ class bên ngoài.
Đặt private static final variable đảm bảo biến chỉ được khởi tạo trong class
Có một method public static để return instance được khởi tạo ở trên
3.
Sử dụng Singleton Pattern khi nào?
Dưới đây là một số trường hợp sử dụng của Singleton Pattern thường gặp:
Vì class dùng Singleton chỉ tồn tại 1 Instance (thể hiện) nên nó thường được dùng cho các trường hợp giải quyết các bài toán cần truy cập vào các ứng dụng như: Shared resource, Logger, Configuration, Caching, Thread pool, …
Một số design pattern khác cũng sử dụng Singleton để triển khai: Abstract Factory, Builder, Prototype, Facade,…
Đã được sử dụng trong một số class của core java như: java.lang.Runtime, java.awt.Desktop
2.2 Factory Method Pattern
1.Định nghĩa:
Factory Method Design Pattern hay gọi ngắn gọn là Factory Pattern là một trong những Pattern thuộc nhóm Creational Design Pattern Nhiệm vụ của Factory Pattern là quản lý
và trả về các đối tượng theo yêu cầu, giúp cho việc khởi tạo đổi tượng một cách linh hoạt hơn
2.Cài đặt Factory Pattern:
Super Class: môt supper class trong Factory Pattern có thể là
một interface abstract class, hay một class thông thường
Sub Classes: các sub class sẽ implement các phương thức của supper class theo nghiệp vụ riêng của nó
Factory Class: một class chịu tránh nhiệm khởi tạo các đối tượng sub class dựa theo tham số đầu vào Lưu ý: lớp này là Singleton hoặc cung cấp một public static method cho việc truy xuất và khởi tạo đối tượng Factory class sử dụng if-else
hoặc switch-case để xác định class con đầu ra
Trang 8Hệ thống được minh họa như sau:
3.
Sử dụng Factory Pattern khi nào?
Factory Pattern được sử dụng khi:
Chúng ta có một super class với nhiều class con và dựa trên đầu vào, chúng ta cần trả về một class con Mô hình này giúp chúng ta đưa trách nhiệm của việc khởi tạo một lớp từ phía người dùng (client) sang lớp Factory
Chúng ta không biết sau này sẽ cần đến những lớp con nào nữa Khi cần mở rộng, hãy tạo ra sub class và implement thêm vào factory method cho việc khởi tạo sub class này
4.
Lợi ích của Factory Pattern là gì?
Lợi ích của Factory Pattern:
Factory Pattern giúp giảm sự phụ thuộc giữa các module (loose coupling): cung cấp 1 hướng tiếp cận với Interface thay thì các implement Giúp chuơng trình độc lập với những lớp cụ thể mà chúng ta cần tạo 1 đối tượng, code ở phía client không bị ảnh hưởng khi thay đổi logic ở factory hay sub class
Mở rộng code dễ dàng hơn: khi cần mở rộng, chỉ việc tạo ra sub class và implement thêm vào factory method
Trang 9Khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đấy Người dùng không biết logic thực sực được khởi tạo bên dưới phương thức factory
Dễ dạng quản lý life cycle của các Object được tạo bởi Factory Pattern
Thống nhất về naming convention: giúp cho các developer có thể hiểu về cấu trúc source code
2.3 Strategy Pattern
1.
Strategy Pattern là gì?
Strategy Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern) Nó cho phép định nghĩa tập hợp các thuật toán, đóng gói từng thuật toán lại, và dễ dàng thay đổi linh hoạt các thuật toán bên trong object Strategy cho phép thuật toán biến đổi độc lập khi người dùng sử dụng chúng
2 Cài đặt Strategy Pattern như thế nào?
Các thành phần tham gia Strategy Pattern:
Strategy : định nghĩa các hành vi có thể có của một Strategy.
ConcreteStrategy : cài đặt các hành vi cụ thể của Strategy.
Context : chứa một tham chiếu đến đối tượng Strategy và nhận các yêu cầu từ
Client, các yêu cầu này sau đó được ủy quyền cho Strategy thực hiện
3.Lợi ích của Strategy Pattern là gì?
Đảm bảo nguyên tắc Single responsibility principle (SRP): một lớp định nghĩa nhiều hành vi và chúng xuất hiện dưới dạng với nhiều câu lệnh có điều kiện Thay vì nhiều điều kiện, chúng ta sẽ chuyển các nhánh có điều kiện liên quan vào lớp Strategy riêng lẻ của nó
Trang 10Đảm bảo nguyên tắc Open/Closed Principle (OCP): chúng ta dễ dàng mở rộng và kết hợp hành vi mới mà không thay đổi ứng dụng
Cung cấp một sự thay thế cho kế thừa
CHƯƠNG 3 XÂY DỰNG ỨNG DỤNG MINH HỌA
3.1 Factory Method Pattern
Trang 113.2 Singleton Pattern
Trang 123.3 Strategy Pattern
Trang 14CHƯƠNG 4 ĐANH GIÁ SO SÁNH KẾT QUẢ
4.1 Factory Method Pattern
4.1.1 Hiệu Suất
Thời Gian Triển Khai: Factory Method Pattern giúp giảm thời gian triển khai các đối tượng, đặc biệt là khi có nhiều lớp con cần tạo
Tái Sử Dụng Mã Nguồn: Giảm lặp lại mã nguồn và tăng tính tái sử dụng
4.1.2 Tính Linh Hoạt
Mở Rộng Dễ Dàng: Có khả năng mở rộng và thay đổi logic tạo đối tượng mà không làm ảnh hưởng đến các phần khác của hệ thống
Loại Bỏ Sự Kết Nối Chặt Chẽ: Loại bỏ sự kết nối chặt chẽ giữa lớp tạo đối tượng và lớp
sử dụng đối tượng
Trang 154.2 Strategy Pattern
4.2.1 Hiệu Suất
Tách Biệt Algorithm: Strategy Pattern giúp tách biệt các thuật toán khác nhau thành các lớp độc lập, giảm ảnh hưởng của sự thay đổi thuật toán lên hệ thống
Dễ Dàng Thay Đổi Chiến Lược: Cho phép dễ dàng thay đổi chiến lược tính toán mà không làm thay đổi cấu trúc của client
4.2.2 Tính Linh Hoạt
Tính Linh Hoạt Cao: Client có khả năng chọn lựa và thay đổi chiến lược tính toán một cách linh hoạt
Dễ Dàng Mở Rộng: Thêm các chiến lược mới mà không làm thay đổi cấu trúc của client
4.3 Singleton Pattern
4.3.1 Hiệu Suất
Tiết Kiệm Tài Nguyên: Singleton Pattern giúp tiết kiệm tài nguyên bằng cách giữ một thể hiện duy nhất của lớp
Thời Gian Truy Cập Nhanh Chóng: Dễ dàng truy cập đối tượng duy nhất từ mọi nơi trong hệ thống
4.3.2 Tính Linh Hoạt
Khả Năng Mở Rộng: Tính linh hoạt thấp vì chỉ có một thể hiện duy nhất của lớp, khó mở rộng khi cần tạo nhiều đối tượng khác nhau
Kết Nối Chặt Chẽ: Có thể tạo ra kết nối chặt chẽ trong quá trình phát triển và kiểm soát
Chương 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
5.1 Kết luận
Factory Method Pattern thích hợp cho các hệ thống cần sự linh hoạt trong việc tạo đối tượng và giảm lặp lại mã nguồn
Strategy Pattern đặc biệt hữu ích khi cần thay đổi hoặc mở rộng các chiến lược tính toán một cách linh hoạt
Singleton Pattern phù hợp khi cần duy trì một thể hiện duy nhất của lớp và tiết kiệm tài nguyên
5.2 Hướng phát triển
Trang 16Để phát triển thêm, có thể xem xét nghiên cứu về sự kết hợp giữa các Design Pattern, hoặc áp dụng các biện pháp khác như Dependency Injection để tăng tính linh hoạt trong
hệ thống