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ễ 61510710642 Trương Quang Duy 61510710393 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.
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.
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 staticmethod 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:
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.
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
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.
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.
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.