ĐỒ ÁN BÀI TẬP CUỐI KHOÁ MÔN MẪU THIẾT KẾ XÂY DỰNG HỆ THỐNG BÁN HÀNG THIẾT BỊ ĐIỆN TỬ ĐỒ ÁN BÀI TẬP CUỐI KHOÁ MÔN MẪU THIẾT KẾ XÂY DỰNG HỆ THỐNG BÁN HÀNG THIẾT BỊ ĐIỆN TỬ
Giới thiệu tính năng của chương trình
Chương trình thiết bị điện tử được phát triển bằng ngôn ngữ lập trình Java, áp dụng các Design Pattern để tối ưu hóa và dễ dàng bảo trì hệ thống Ứng dụng này cho phép người dùng mua bán thiết bị điện tử, lưu trữ dữ liệu người dùng sau khi đăng ký, quản lý thông tin sản phẩm và hỗ trợ xuất hóa đơn sau khi xác nhận thanh toán.
- Chức năng mua bán hàng hoá:
Người dùng có thể dễ dàng mua bán các sản phẩm trong chương trình thiết bị điện tử bằng cách chọn mặt hàng mong muốn và xác nhận giao dịch.
- Chức năng lưu trữ dữ liệu:
Thông tin các nhân của khách hàng.
Thông tin các mặt hàng được bán.
- Chức năng xuất hoá đơn:
Tổng thể thiết kế
UML Classdiagram của chương trình thiết bị điện tử thể hiện chi tiết các lớp (class) và cấu trúc tĩnh của hệ thống Nó mô tả các đặc trưng cơ bản như các lớp và mẫu thiết kế (Design Pattern) được áp dụng để nâng cao năng suất, cải thiện chất lượng mã nguồn và giảm thiểu tài nguyên trong quá trình bảo trì.
Chương trình thiết bị điện tử sử dụng 6 mẫu thiết kế (Design Pattern) bao gồm:
Áp dụng các mẫu thiết kế như Data Access Object, Command, Decorator, Template, Singleton, và Factory Pattern, chương trình có thể thực hiện đầy đủ các chức năng cơ bản như lưu trữ dữ liệu khách hàng và hàng hóa, xuất hóa đơn bán hàng, tái sử dụng mã nguồn, mở rộng các hàm hoặc lớp mà không cần thay đổi mã, và định nghĩa lại cách thực hiện của một số lớp mà không làm thay đổi thuật toán Hệ thống cũng được quản lý và thực thi theo yêu cầu của người dùng, đảm bảo tính linh hoạt và hiệu quả trong quá trình phát triển phần mềm.
Các mẫu thiết kế
Data Access Object pattern
Tôi đang thực hiện một dự án bán thiết bị điện tử với cơ sở dữ liệu MySQL để lưu trữ thông tin người dùng như email và mật khẩu Để tương tác với cơ sở dữ liệu, tôi sử dụng trình điều khiển SQL Tuy nhiên, trong quá trình phát triển hệ thống bán hàng, giám đốc sản xuất phần mềm đã đề xuất chuyển sang sử dụng Oracle.
Database Sau đó chúng tôi phải định dạng lại mã sao cho phù hợp với cơ sở dữ liệu này.
Vấn đề phát sinh khi các lớp nghiệp vụ kết hợp chặt chẽ với lớp logic lưu trữ, đặc biệt khi chúng ta chuyển đổi sang cơ sở dữ liệu khác.
Mẫu thiết kế Data Access Object (DAO) thuộc nhóm cấu trúc, giúp phân tách logic lưu trữ dữ liệu trong một lớp riêng biệt Điều này cho phép các dịch vụ ẩn đi cách thức thực hiện các hoạt động cấp thấp để truy cập cơ sở dữ liệu Thay vì để logic giao tiếp trực tiếp với cơ sở dữ liệu, hệ thống file hay dịch vụ web, logic sẽ tương tác với lớp trung gian DAO Lớp DAO này sẽ đảm nhiệm việc giao tiếp với hệ thống lưu trữ và thực hiện các tác vụ liên quan đến lưu trữ và truy vấn dữ liệu như tìm kiếm, thêm, xóa và sửa.
Lớp DAO đóng vai trò là lớp trung gian, cho phép các lớp khác giao tiếp với các lớp logic lưu trữ, bất kể cơ chế lưu trữ nào như quản lý tệp hay cơ sở dữ liệu, và thực hiện các thao tác CRUD UML có thể được sử dụng để minh họa cấu trúc và mối quan hệ giữa các lớp trong thiết kế này Pattern DAO thường được ứng dụng trong các hệ thống phần mềm để tách biệt logic kinh doanh và logic truy cập dữ liệu, giúp tăng tính linh hoạt và khả năng bảo trì của ứng dụng.
DAO Pattern dựa trên các nguyên tắc thiết kế abstraction và encapsulation.
Mẫu DAO (Data Access Object) giúp bảo vệ ứng dụng khỏi các thay đổi trong lớp lưu trữ, như chuyển đổi cơ sở dữ liệu từ Oracle sang MySQL hoặc thay đổi công nghệ lưu trữ từ file sang database Để triển khai mẫu DAO, chúng ta cần thực hiện bốn bước cơ bản.
1 Tạo lớp Accounts bao gồm các thuộc tính (name, email, id) chứa các phương thức get/set được sử dụng để lưu trữ dữ liệu và được sử dụng trong DAO class.
2 Tạo lớp DAO (phương thức Design Access Object) là một interface định nghĩa các phương thức trừu tượng việc triển khai truy cập dữ liệu cơ bản choBusinessObject để cho phép truy cập vào nguồn dữ liệu.
4 Tạo lớp Client để có thể chạy thử code
Singleton pattern
Singleton là 1 trong 5 design pattern của nhóm Creational Design Pattern.
Singleton đảm bảo rằng chỉ có một thể hiện duy nhất được tạo ra trong chương trình, và cung cấp một phương thức để truy xuất thể hiện này ở bất kỳ đâu UML minh họa cấu trúc của pattern này, cho thấy cách thức hoạt động và các mối quan hệ giữa các thành phần Pattern Singleton được ứng dụng rộng rãi trong lập trình để quản lý tài nguyên, duy trì trạng thái toàn cục và kiểm soát truy cập đến các dịch vụ chung.
The Singleton class is designed to ensure that only one instance exists, making it ideal for scenarios that require centralized access to resources such as shared resources, logging, configuration management, caching, and thread pooling.
Một số design pattern khác cũng sử dụng Singleton để triển khai: Abstract
Factory pattern
Factory Pattern là một trong những mẫu thiết kế thuộc nhóm Creational Design Pattern Chức năng chính của Factory Pattern là quản lý và cung cấp các đối tượng theo yêu cầu, từ đó tạo điều kiện cho việc khởi tạo đối tượng một cách linh hoạt hơn.
Factory Pattern đúng nghĩa là một nhà máy, và nhà máy này sẽ “sản xuất” các đối tượng theo yêu cầu của chúng ta.
Hệ thống mua bán điện thoại cung cấp API cho phép khách hàng đặt hàng bất kỳ loại điện thoại nào Đội ngũ thiết kế API nhằm mục đích giúp khách hàng dễ dàng sử dụng dịch vụ cho hai loại điện thoại hiện tại, đồng thời đảm bảo tính mở rộng trong tương lai mà không cần thay đổi mã nguồn Để đáp ứng yêu cầu này, việc áp dụng Factory Pattern là một giải pháp hợp lý.
Chúng ta sử dụng một super class với nhiều class con, và tùy thuộc vào đầu vào, chúng ta sẽ trả về một class con phù hợp Mô hình này chuyển giao trách nhiệm khởi tạo lớp từ phía người dùng sang lớp Factory, giúp tối ưu hóa quy trình và giảm thiểu sự phức tạp cho client.
SessionFactory trong Hibernate Framework. d) Mô tả khái quát về code: Để tạo một ví dụ Factory Pattern kể trên chúng ta sẽ tiến hành 6 bước sau:
1 Tạo lớp smartphone chứa các phương thức price, Delivery, getDescription được sử dụng để mô tả giá thành và tên sản phẩm đồng thời để áp dụng template pattern.
2 Tạo lớp Dienthoaicaocap là môt supper class trong Factory Pattern có thể là một interface, abstract class hay một class thông thường.
3 Tạo lớp Dienthoaitamtrung là môt supper class trong Factory Pattern có thể là một interface, abstract class hay một class thông thường.
4 Smartphonefactory là 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
5 Iphone12promax và Samsung21ultra là những lớp con được kế thừa từ lớp Dienthoaicaocap đồng thời có các tính năng mua sản phẩm khác như airpod.
6 Realmesix và Xiaominote8 là những lớp con được kế thừa từ lớpDienthoaitamtrung.
7 Tạo lớp Client để chạy thử code
Template Pattern
Dự án bán thiết bị điện tử bao gồm nhiều sản phẩm như điện thoại và máy tính Trong phân khúc điện thoại, chúng tôi cung cấp các dòng tầm trung và cao cấp Đối với điện thoại tầm trung, khách hàng được hưởng các dịch vụ như vận chuyển và thanh toán Đối với điện thoại cao cấp, chúng tôi còn cung cấp thêm các dịch vụ như phụ kiện và bảo hành tại nhà, mang lại sự tiện lợi tối đa cho người dùng.
Các phân khúc điện thoại đều sử dụng các phương thức dịch vụ cơ bản giống nhau, như vận chuyển và thanh toán Chúng tôi có thể tận dụng các chức năng chung của hai dòng phân khúc này để tiết kiệm thời gian và bổ sung một số chức năng mới cho dòng phân khúc cao cấp Do đó, chúng tôi áp dụng phương pháp Template Method Pattern trong trường hợp này.
Mẫu Template Pattern định nghĩa cấu trúc của một thuật toán trong một hàm, cho phép các lớp con thực hiện chi tiết cụ thể Mẫu Template Method cho phép các lớp con tùy chỉnh cách thức thực hiện thuật toán mà không cần thay đổi cấu trúc tổng thể của nó.
Phương pháp Template giúp chúng tôi xây dựng một khung chung cho việc giải quyết các vấn đề cụ thể, như việc tái sử dụng các chức năng đã có cho phân khúc điện thoại tầm trung và bổ sung thêm cho điện thoại cao cấp Các đối tượng như delivery, payment, và addtocart sẽ có quy trình thực hiện tương đồng, nhưng mỗi bước có thể khác nhau, tạo ra một cách truy cập nhất quán với hành động và kết quả đa dạng Chúng tôi có thể phát triển một phương thức để xác định các thuật toán, tương tự như hàm Delivery, Payment, và Addtocart đã sử dụng trước đây, nhằm thực hiện các chức năng cho điện thoại cao cấp.
Tái sử dụng code giúp tránh trùng lặp và dễ dàng thêm chức năng mới bằng cách sử dụng các chức năng đã có sẵn Ví dụ, các thiết bị điện thoại cao cấp có thể tận dụng những chức năng từ điện thoại tầm trung Để áp dụng Template Pattern vào hệ thống bán hàng thiết bị điện tử, chúng tôi thực hiện các bước cụ thể nhằm tối ưu hóa quy trình phát triển.
Chúng tôi tạo một lớp Smartphone chứa các chức năng có thể sử dụng chung
Sau đó tiến hành triển khai chức năng ỏ hai phân khúc điện thoại cao cấp và điện thoại tầm trung.
Sau khi hoàn thành việc lập trình các chức năng, chúng tôi có thể áp dụng chung những tính năng tương tự cho cả điện thoại tầm trung và điện thoại cao cấp, từ đó tiết kiệm thời gian phát triển.
Decorator pattern
Mẫu thiết kế Decorator được sử dụng chủ yếu để mở rộng các phương thức một cách linh hoạt UML minh họa rõ ràng cách thức hoạt động của mẫu này Ứng dụng của pattern này rất đa dạng và hiệu quả trong việc cải tiến chức năng của các đối tượng mà không cần thay đổi cấu trúc ban đầu.
Mẫu thiết kế Decorator thuộc nhóm cấu trúc, cho phép mở rộng một đối tượng bằng cách thêm các biến hoặc phương thức mới Trong lĩnh vực thiết bị điện tử, đặc biệt là máy tính, khả năng mở rộng của sản phẩm rất phong phú, vì vậy việc áp dụng Decorator pattern giúp tối ưu hóa hiệu suất chương trình.
Từ lớp computer, chúng tôi có thể phát triển thêm nhiều lớp khác để tăng cường sự đa dạng cho sản phẩm, mang đến nhiều lựa chọn về phụ kiện và các gói mở rộng khác nhau.
Lớp CaseCPU lại chính là lớp mở rộng của Ecomponents tạo khả năng tuỳ biến cao cho hệ thống thiết bị điện tử của chúng tôi.
Command pattern
Command Pattern là một trong những pattern hành vi quan trọng, cho phép đóng gói thông tin cần thiết vào một đối tượng để thực hiện hành động hoặc kích hoạt sự kiện sau này Thông tin này có thể bao gồm tên phương thức, các biến và giá trị cần thiết, giúp chuyển đổi yêu cầu thành một đối tượng độc lập Với Command Pattern, tất cả các yêu cầu gửi đến đối tượng được lưu trữ trong chính đối tượng đó dưới dạng một đối tượng Command, mang lại tính linh hoạt và khả năng quản lý tốt hơn cho các thao tác trong lập trình.
Vì những lợi ích mà Command Pattern mang lại, chúng tôi áp dụng mẫu này trong việc lưu trữ và xuất hóa đơn bán hàng sau khi khách hàng hoàn tất thủ tục mua hàng Dưới đây là UML minh họa cho ứng dụng của mẫu này.
Sau khi khách hàng thực hiện mua hàng, yêu cầu từ phía họ sẽ được đóng gói thành một đối tượng command và chuyển đến một thành phần riêng biệt để thực thi, có thể gửi trực tiếp hoặc đưa vào một queue để lưu trữ Mẫu lệnh (Command pattern) giúp tách biệt quá trình tiếp nhận yêu cầu và quá trình thực thi yêu cầu Cuối cùng, khách hàng sẽ nhận được hóa đơn bao gồm thông tin chi tiết về sản phẩm đã mua.
Chính vì vậy, công việc xử lý request sẽ trở nên linh hoạt và dễ nâng cấp hơn. d) Mô tả khái quát về code:
Khách hàng cung cấp thông tin bán hàng sẽ được lưu trữ vào mục "smartphone order" nếu họ mua điện thoại, hoặc vào mục "computer order" nếu họ mua máy tính.
Sau đó thông tin sẽ được chuyển tới CommandPattern và xuất ra màn hình hoá đơn mua hàng của khách hàng.
IV Kết quả đạt được và hướng mở rộng:
Hệ thống thiết bị điện tử của chúng tôi đã đạt được kết quả đáp ứng đầy đủ các yêu cầu mục tiêu đề ra Việc áp dụng 6 design pattern không chỉ nâng cao hiệu quả cho chương trình mà còn giúp tiết kiệm thời gian hoàn thành mã nguồn.
Trong tương lai, hệ thống sẽ phát triển với nhiều dòng điện thoại và máy tính đa dạng, mang đến cho người dùng nhiều sự lựa chọn hơn Chúng tôi sẽ cải thiện cơ sở dữ liệu và bổ sung các chức năng như đăng ký khách hàng, quản lý dữ liệu, đồng thời tối ưu hóa mã nguồn để nâng cao hiệu suất hệ thống.
Source code: https://github.com/huyquag/Design-Pattern-FinalProject