Các vấn đề thực tế khác và cách áp dụng Flyweight Design Pattern trong web dev, mobile dev...8 11... Nó được sử dụng để tối ưu hóa việc sử dụng bộ nhớ bằng cách chia sẻ các đối tượng có
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
� �
ĐỒ ÁN DESIGN PATTERN
ĐỀ TÀI: FLYWEIGHT
MÔN HỌC: PHƯƠNG PHÁP LẬP
TRÌNH HƯỚNG ĐỐI TƯỢNG
Học kỳ II (2022-2023)
SV Thực hiện 1: DƯƠNG HUỲNH ANH DUY
SV Thực hiện 2: ĐOÀN ĐỨC HỮU
SV Thực hiện 3: NGÔ QUỐC HUY
SV Thực hiện 4: QUÁCH ĐỨC HUY
SV Thực hiện 5: TRẦN NGUYỄN GIA HUY
TP HỒ CHÍ MINH, THÁNG 5 NĂM 2023
Trang 2MỤC LỤC
BẢNG PHÂN CÔNG VIỆC NHÓM 1
1 Thông tin nhóm 1
2 Phân công công việc và mức độ hoàn thành 1
NỘI DUNG 2
1 Nêu vấn đề 2
2 Giài pháp đơn giản (không sử dụng pattern) 2
3 Các vấn đề xảy ra với giải pháp đơn giản 2
4 Flyweight Design Pattern 2
5 Sơ đồ lớp chung 3
6 Sơ đồ lớp cho vấn đề trong bước 1 4
7 Cài đặt Flyweight Design Pattern 4
8 So sánh chi phí khi sử dụng và không sử dụng Flyweight 6
9 Ưu điểm và nhược điểm của Flyweight Design Pattern 7
10 Các vấn đề thực tế khác và cách áp dụng Flyweight Design Pattern trong web dev, mobile dev 8
11 Một số câu hỏi về Flyweight 9
TÀI LIỆU THAM KHẢO 10
Trang 3BẢNG PHÂN CÔNG VIỆC NHÓM
1 Thông tin nhóm
2 Phân công công việc và mức độ hoàn thành.
Dương Huỳnh Anh Duy 21120441
-100%
-100%
-100%
-100%
Trang 4
-100%
NỘI DUNG
1 Nêu vấn đề.
Giả sử bạn đang phát triển một ứng dụng đồ họa để vẽ các hình đơn giản như hình tròn, hình vuông, hình chữ nhật, v.v Mỗi hình có các
dụng và chạy thử, chương trình liên tục gặp sự cố sau vài phút trải nghiệm Sau vài giờ tìm hiểu, bạn phát hiện ra rằng ứng dụng bị lỗi
do không đủ dung lượng RAM Trong ứng dụng đồ họa, khi vẽ các đối tượng tương tự nhau lên màn hình, chúng ta thường tạo ra rất nhiều đối tượng tương tự nhau trong bộ nhớ Điều này sẽ làm tăng tài nguyên của hệ thống và làm cho ứng dụng chạy chậm hơn, thậm chí
là crash chương trình
2 Giài pháp đơn giản (không sử dụng pattern)
Giải pháp đơn giản là tạo ra một đối tượng mới cho mỗi lần vẽ Tuy nhiên, điều này sẽ dẫn đến tình trạng tốn tài nguyên và giảm hiệu suất ứng dụng
3 Các vấn đề xảy ra với giải pháp đơn giản
- Tốn tài nguyên hệ thống
- Giảm hiệu suất của ứng dụng
- Không tối ưu khi vẽ nhiều đối tượng tương tự
Trang 54 Flyweight Design Pattern
Structural Pattern Nó được sử dụng để tối ưu hóa việc sử dụng bộ nhớ bằng cách chia sẻ các đối tượng có tính chất tương tự giữa các đối tượng khác nhau mà không ảnh hưởng đến hành vi của chúng Các thành phần chính trong Flyweight pattern bao gồm:
- Flyweight Interface: là giao diện hoặc lớp trừu tượng mô tả các phương thức
mà các đối tượng Flyweight cần hỗ trợ
- Concrete Flyweight: là lớp cài đặt Flyweight Interface, chứa dữ liệu cần thiết
để tạo ra các đối tượng Flyweight Các đối tượng này có thể được chia sẻ giữa nhiều đối tượng khác nhau Có thể có nhiều Concrete Flyweight
- Flyweight Factory: là lớp tạo ra và quản lý các đối tượng Flyweight Nó giúp đảm bảo rằng các đối tượng Flyweight được tái sử dụng nếu chúng đã được tạo trước đó, thay vì tạo ra một đối tượng mới
- Client: là lớp sử dụng các đối tượng Flyweight Nó tương tác với Flyweight Factory để tạo ra các đối tượng Flyweight và sử dụng chúng
Ngoài ra còn có thể có thêm thành phần Unshared Concrete Flyweight là thành phần không chia sẻ thông tin giữa các đối tượng
Trang 65 Sơ đồ lớp chung
Sơ đồ lớp chung của Flyweight Design Pattern.
Chú thích:
- intrinsicState: các thuộc tính nội tại, giống nhau giữa các đối tượng
- extrinsicState: các thuộc tính bên ngoài, khác nhau giữa các đối tượng
Trang 76 Sơ đồ lớp cho vấn đề trong bước 1
Sơ đồ lớp áp dụng Flyweight Design Pattern cho vấn đề được đưa ra ở bước 1.
Chú thích:
- Trong ví dụ này, không có thành phần Unshared Concrete Flyweight
- Có 2 Concrete Flyweight là Circle và Rectangle
7 Cài đặt Flyweight Design Pattern
Để triển khai Flyweight Design Pattern, chúng ta cần phải xác định các thành phần của mẫu thiết kế, bao gồm:
struct Point
{
int x, y;
};
class Shape
{
public:
virtual void draw() = 0;
virtual void setShape( const Point &, const float &, const float & = 0) = 0; };
Trang 8 Lớp Circle:
class Circle : public Shape
{
private:
Point center;
float radius;
string color;
public:
Circle( string _color = "" , Point _center = { 0,0 }, float _radius = 0);
0);
void draw();
};
class Rectangle : public Shape
{
private:
Point A; // toa do goc trai tren
float length, width;
string color;
public:
= 0);
void setShape( const Point & _A , const float & _length , const float & _width = 0); void draw();
};
unordered_map, đây là cấu trúc lưu dữ liệu dưới dạng key-value
class ShapeFactory
{
private:
static unordered_map string Shape < , *> circlesList;
static unordered_map string Shape < , *> rectanglesList;
public:
static Shape * getCircle( const string & color );
static Shape * getRectangle( const string & color );
static int getSizeCircle()
{
return circlesList.size();
}
static int getSizeRectangle()
{
return circlesList.size();
}
static void deleteCircles();
static void deleteRectangles();
};
trong Source Code
Trang 9khởi tạo này; ngược lại nếu không tồn tại trong unordered_map, tức đối tượng này chưa được khởi tạo trước đó, phương thức sẽ khởi tạo một đối tượng mới, cập nhật vào unordered_map và trả về đối tượng này mới vừa tạo này
Shape ShapeFactory * ::getCircle( const string & color )
{
if (circlesList.find( color ) circlesList.end()) !=
{
return circlesList [ color ] ;
}
else
{
Shape * newCircle = new Circle ( color );
return newCircle;
}
}
Phương thức deleteCircles() sẽ duyệt từ phần tử đầu tiên đến phần tử cuối cùng
void ShapeFactory ::deleteCircles()
{
for ( auto iter = circlesList.begin(); iter circlesList.end(); iter != ++ )
{
if (iter second != -> NULL )
{
cout << "delete " << iter first -> << " circle" << endl;
delete iter -> second;
}
}
circlesList.clear();
}
- Client: Trong ví dụ này, ta không xây dựng lớp Client mà sẽ gọi trực tiếp trong hàm main để kiểm tra
8 So sánh chi phí khi sử dụng và không sử dụng Flyweight.
// Khong dung Flyweight
int cost = 0;
// tao 1000 hinh tron mau do
for int ( i = 0; i < 1000; i++)
{
Circle c( "red" , { i, i }, 3);
}
// tao 1500 hinh tron mau vang
for int ( i = 0; i < 1500; i++)
{
Circle c( "yellow" , { i, i }, 3);
}
cout << "Chi phi cho giai phap don gian: " << cost << endl;
// Dung Flyweight
cost = 0;
Trang 10// tao 1000 hinh tron mau do
Shape * temp = ShapeFactory ::getCircle( "red" );
for int ( i = 0; i < 999; i++)
{
Shape * c = ShapeFactory ::getCircle( "red" );
{
}
}
// tao 1500 hinh tron mau vang
for int ( i = 0; i < 1499; i++)
{
Shape * c = ShapeFactory ::getCircle( "yellow" );
{
}
}
cout << "Chi phi khi su dung Flyweight: " << cost << endl;
Kết quả khi chạy chương trình:
Ta có thể thấy khi có càng nhiều các đối tượng tương tự nhau thì bộ nhớ được giảm một cách đáng kể
9 Ưu điểm và nhược điểm của Flyweight Design Pattern
Ưu điểm của Flyweight Design Pattern:
- Tối ưu hóa tài nguyên và tăng hiệu suất ứng dụng bằng cách giảm lượng dữ liệu cần được lưu trữ trong bộ nhớ
- Tăng khả năng tái sử dụng code bằng cách tái sử dụng các đối tượng Flyweight
đã tồn tại
- Giảm thiểu số lượng đối tượng trong hệ thống, tăng tính linh hoạt và dễ dàng
mở rộng hệ thống
- Cải thiện khả năng điều khiển và quản lý các đối tượng trong hệ thống Nhược điểm của Flyweight Design Pattern:
- Điều kiện tiên quyết để áp dụng mẫu thiết kế này là phân tích kỹ thuật của dữ liệu và xác định được các đối tượng nào có thể chia sẻ, điều này có thể tốn nhiều thời gian và công sức
Trang 11- Sử dụng Flyweight Design Pattern có thể làm cho code phức tạp hơn nếu không được thực hiện đúng cách
- Nếu sử dụng Flyweight Design Pattern một cách không cẩn thận, có thể dẫn đến lỗi hoặc trở thành một nguồn gốc của vấn đề về hiệu suất trong hệ thống
10 Các vấn đề thực tế khác và cách áp dụng Flyweight Design Pattern trong web dev, mobile dev.
Flyweight Design Pattern có thể giải quyết nhiều vấn đề khác nhau trong web dev và mobile dev Sau đây là một số vấn đề và cách áp dụng Flyweight Design Pattern để giải quyết chúng:
tính năng xử lý dữ liệu lớn, tốc độ xử lý là rất quan trọng Flyweight Design Pattern có thể được sử dụng để tối ưu hóa tốc
độ xử lý bằng cách sử dụng các đối tượng tái sử dụng chung để giảm thiểu số lượng đối tượng cần được tạo ra mới
quan trọng vì thiết bị di động có giới hạn bộ nhớ Flyweight Design Pattern có thể được sử dụng để tối ưu hóa bộ nhớ bằng cách sử dụng các đối tượng tái sử dụng chung để giảm thiểu số lượng đối tượng cần được tạo ra mới
thể được sử dụng để cải thiện trải nghiệm người dùng bằng cách tối ưu hóa hiệu năng ứng dụng Việc giảm thiểu thời gian phản hồi và tăng tốc độ tải trang/ứng dụng sẽ làm cho trải nghiệm người dùng trở nên tốt hơn
có tính năng liên quan đến mạng, giảm thiểu lưu lượng mạng là rất quan trọng để tiết kiệm băng thông và tăng tốc độ tải trang/ứng dụng Flyweight Design Pattern có thể được sử dụng
để giảm thiểu lưu lượng mạng bằng cách sử dụng các đối tượng tái sử dụng chung để giảm thiểu số lượng dữ liệu phải truyền đi
Trang 1211 Một số câu hỏi về Flyweight.
1 Flyweight pattern giúp cải thiện gì trong việc lập trình?
a) Hiệu năng
b) Khả năng bảo mật
c) Khả năng kiểm tra lỗi
d) Tất cả các phương án đều đúng
Đáp án: a
2 Flyweight pattern sử dụng cơ chế gì để giảm bớt tài nguyên sử dụng?
a) Chia sẻ đối tượng
b) Tạo nhiều đối tượng
c) Lưu trữ đối tượng trong cache
d) Không có cơ chế nào được sử dụng
Đáp án: a
3 Flyweight pattern có bao nhiêu thành phần chính?
a) 2
b) 3
c) 4
d) 5
Đáp án: c
4 Flyweight pattern sử dụng loại thiết kế nào?
a) Thiết kế tạo đối tượng
b) Thiết kế cấu trúc
c) Thiết kế hành vi
d) Thiết kế kiến trúc
Đáp án: b
5 Đối tượng flyweight được chia làm mấy loại?
a) 1
b) 2
c) 3
d) 4
Trang 13Đáp án: b
7 Trong Flyweight pattern, state extrinsic là gì?
a) Thuộc tính giống nhau giữa các đối tượng flyweight
b) Thuộc tính khác nhau giữa các đối tượng flyweight
c) Thuộc tính liên quan đến trạng thái của đối tượng flyweight d) Không có khái niệm này trong Flyweight pattern
Đáp án: b
8 State intrinsic trong Flyweight pattern là gì?
a) Thuộc tính giống nhau giữa các đối tượng flyweight
b) Thuộc tính khác nhau giữa các đối tượng flyweight
c) Thuộc tính liên quan đến trạng thái của đối tượng flyweight d) Không có khái niệm này trong Flyweight pattern
Đáp án: a
9 Các thành phần chính của Flyweight pattern là gì?
a) Client, Flyweight, Concrete Flyweight, Unshared Concrete Flyweight
b) Client, Flyweight, Concrete Flyweight, Flyweight Factory
c) Client, Flyweight, State, Cache
d) Client, Flyweight, ConcreteFlyweight, State, Cache
Đáp án: b
TÀI LIỆU THAM KHẢO