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 đó.
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:
bao_cao_cuoi_ky_mon_lap_trinh_huong_doi_tuong_chu_de_mau_thi.docx
State_Pattern.pptx
Bai_Tap_state_pattern.docx

