Báo cáo cuối kỳ môn Lập trình hướng đối tượng - Chủ đề: Mẫu thiết kế Flyweight - Đinh Công Thành

Báo cáo Seminar  
Chủ đề: Mẫu thiết kế Flyweight  
Nhóm 5:  
1760421 - Đinh Công Thành  
1760263 - Phạm Thiên Bảo  
1760361 – Vũ Văn Lương  
1760450 – Trương Quốc Trọng  
1. Ví dụ bài toán:  
Ví dụ rằng, ở cương vị một giáo viên, bạn cần phải quản lí điểm của học sinh.  
Chương trình mà bạn cần có để theo dõi hồ sơ học sinh cho từng học sinh có  
thể là những đối tượng thật sự lớn.  
2. Cách giải:  
Nếu chúng ta giải bài toán này dùng mô hình lập trình hướng đối tượng thông  
thường . Chúng ta phải ta ra đủ số object để quản lí đủ số học sinh.  
3. Nhược điểm cách giải trên  
Có khả năng chúng ta phải tạo ra số object đại diện bằng số học sinh(có thể  
lên tới 100 object), điều nay sẽ ảnh hướng lớn đến hiệu suất hoạt động của  
hệ thống vì phải xử lý một lượng dữ liệu tương đối lớn.  
4. Giới thiệu pattern  
➢ Mẫu thiết kế (Design Patterns) là một giải pháp tổng thể cho các vấn đề  
chung trong thiết kế phần mềm. Nó không phải là một chuẩn được quy  
định bởi một tổ chức nào cả mà chỉ là những thiết kế của các chuyên gia đã  
được sử dụng và được đánh giá tốt giúp giải quyết những vấn đề thiết kế  
thường gặp. Mẫu thiết kế chú trọng việc giúp phần mềm có tính uyển  
chuyển, dễ nâng cấp và thay đổi.  
➢ Mẫu thiết kế được phân loại ra thành 3 nhóm chính:  
• Structural Patterns: liên quan đến các vấn đề làm thế nào để các lớp  
và đối tượng kết hợp với nhau tạo thành các cấu trúc lớn hơn (gồm  
Adapter, Bridge, Composite, Decorator, …).  
• Creational Patterns: Khắc phục các vấn đề về khởi tạo đối tượng, hạn  
chế sự phụ thuộc nền tảng (gồm Factory, Abstract Factory, Singleton,  
Prototype, Builder…).  
• Behavioral Patterns: Mô tả cách thức để các lớp hoặc đối tượng có  
thể giao tiếp với nhau (gồm State, Observer, Strategy, Template, …).  
• Flyweight pattern nằm trong phần Structural Pattern  
5. Cách giải bài toán trên sử dụng flyweight  
Để tạo mã nguồn cho một đối tượng học viên, bạn quyết định cài đặt  
nó như một đối tượng Flyweight với tên Student. Đối tượng này  
được cấu hình sao cho trông giống nhiều học viên mà bạn muốn. Vì  
vậy bạn thêm vào các hàm thiết lập thông tin và trả thông tin, chẳng  
hạn tên học viên, mã số, và điểm.  
Bạn cùng có thể muốn so sánh học lực của các học viên với nhau,  
nên bạn thêm một hàm getStanding, có thể trả về mối tương quan  
của học lưc học viên và điểm trung bình . Mã như sau:  
Lưu ý rằng hàm getStanding sẽ trả về sự khác biệt phần trăm điểm  
số của sinh viên so với điểm trung bình.  
Chạy thử mẫu Flyweight  
Để sử dụng mẫu flyweight, bạn phải lưu trữ dữ liệu mà bạn muốn  
cấu hình cho flyweight. Trong trường hợp này bạn muốn cài đặt cho  
đối tượng Student giống như một tập hợp các học viên có thật, vì vậy  
bạn có thể lưu trữ dữ liệu sinh viên ( như tên, mã số, điểm ) bằng  
một dãy như sau:  
Để so sánh học viên này với học viên khác, bạn cần xác định điểm  
trung bình ( tổng điểm chia cho số sinh viên ), mã như sau:  
Trong ví dụ này, bạn cần duy nhất một đối tượng flyweight Student,  
bạn sẽ truyền giá trị điểm số trung bình qua hàm khởi dựng của  
Student như sau:  
Bây giờ bạn phải cài đặt đối tượng flyweight theo ý muốn, thay vì  
phải tạo từng đối tượng riêng biệt cho từng sinh viên một. Hãy xem  
cách thức vòng lặp sau thực hiện:  
Chạy mã trên và bạn nhận được kết quả mong muốn. Đối tượng  
flyweight đã được cấu hình cho từng học viên, thể hiện được tên và  
xếp hạng:  
Thay vì sử dụng ba đối tượng đầy đủ, bạn chỉ cần sử dụng một đối  
tượng. Cũng gần giống mẫu Singleton, tuy nhiên ý tưởng đằng sau  
mẫu Flyweight là kiểm soát việc tạo dựng đối tượng, và số lượng đối  
tượng theo ý bạn muốn.  
Xử lý vấn đề đa luồng(Tìm hiểu thêm)  
Mẫu flyweight được sử dụng để kiểm soát việc tạo dựng đối  
tượng, nhưng bạn lưu ý rằng nó cũng bị chung một vấn đế với mẫu  
Singleton mà chúng ta đã nhắc tới. Nếu mã nguồn của bạn có sử  
dụng đa luồng, bạn có thể tránh việc tạo ra quá nhiều đối tượng  
flyweight bằng cách tách rời quá trình tạo đối tượng ra khỏi toán tử  
new như đã từng làm với mẫu Singleton. Bạn có thể tạo đối tượng  
flyweight ngay khi lớp được nạp lần đầu tiên, ngăn cản việc truy xuất  
hàm khởi dựng bằng cách gán cho nó một truy cập cục bộ, và cho  
phép việc tạo đối tượng thông qua hàm getInstance.  
Source Code C++:  
#include<iostream>  
using namespace std;  
#include<string>  
class Student  
{
private:  
string name;  
int id;  
int score;  
double scoreTB;  
public:  
Student(double a)  
{
scoreTB = a;  
}
void setName(string n)  
{
name = n;  
}
void setId(int i)  
{
id = i;  
}
void setScore(int s)  
{
score = s;  
}
string getName()  
{
return name;  
}
int getId()  
{
return id;  
}
int getScore()  
{
return score;  
}
double getStanding()  
{
return (1.0 * score / scoreTB) * 100;  
}
};  
void main()  
{
string name[] = { "Ralph","Alice","Sam" };  
int ids[] = { 1001,1002,1004 };  
int score[] = { 44,55,65 };  
int n = sizeof(score) / sizeof(score[0]);  
double total = 0;  
for (int i = 0; i < n; i++)  
total += score[i];  
double TbScore = total / n;  
Student *student = new Student(TbScore);  
for (int i = 0; i < n; i++)  
{
student->setName(name[i]);  
student->setId(ids[i]);  
student->setScore(score[i]);  
cout << "Name: " << student->getName();  
cout << "\tStanding:" << student->getStanding() << endl;  
}
}
6. Một số bài toán liên quan  
VD1:Một ví dụ chung nhất đó là các cái cây. Mỗi cây trong một game đều  
giống với tất cả các cây khác. Vậy cái mà có thể chia sẻ được tới tất cả các  
cây đó là:  
– Chúng có mesh giống nhau  
– Chúng sử dụng textures giống nhau  
VD2: Một ví dụ khác là các kí tự được lưu trong một bộ xử lí văn bản (word  
processor). Mỗi kí tự đại diện cho một đối tượng mà có dữ liệu là loại font  
(font face), kích thước font, và các dữ liệu định dạng khác. Bạn có thể  
tưởng tượng là, với một tài liệu (document) lơn với cấu trúc dữ liệu như thế  
này thì sẽ bộ xử lí văn bản sẽ khó mà có thể xử lí được. Hơn nữa, vì hầu hết  
dữ liệu dạng này là lặp lại, phải có một cách để giảm việc lưu giữ này - đó  
chính là mẫu Flyweight. Mỗi đối tượng kí tự sẽ chứa một tham khảo đến  
một đối tượng định dạng riêng rẽ mà chính đối tượng này sẽ chứa các  
thuộc tính cần thiết. Điều này sẽ giảm một lượng lớn sự lưu giữ bằng cách  
kết hợp mọi kí tự có định dạng giống nhau trở thành các đối tượng đơn chỉ  
chứa tham khảo đến cùng một đối tượng đơn chứa định dạng chung đó.  
docx 6 trang myanh 25580 Free
Bạn đang xem tài liệu "Báo cáo cuối kỳ môn Lập trình hướng đối tượng - Chủ đề: Mẫu thiết kế Flyweight - Đinh Công Thành", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docxbao_cao_cuoi_ky_mon_lap_trinh_huong_doi_tuong_chu_de_mau_thi.docx
  • pptxState_Pattern.pptx
  • docxBai_Tap_state_pattern.docx