"A fine-grained instance used for efficient sharing"
The Flyweight
uses sharing to support large numbers of objects
efficiently. Modern web browsers use this technique to prevent loading
same images twice. When browser loads a web page, it traverse through
all images on that page. Browser loads all new images from Internet and
places them the internal cache. For already loaded images, a flyweight
object is created, which has some unique data like position within the
page, but everything else is referenced to the cached one.
Explore My Other Channel for More Cool and Valuable Insights
👉 Youtube Learn Tech Tips👉 Tiktok
👉 Facebook:Rules of thumb
- Whereas Flyweight shows how to make lots of little objects, Facade shows how to make a single object represent an entire subsystem.
- Flyweight is often combined with Composite to implement shared leaf nodes.
- Terminal symbols within Interpreter's abstract syntax tree can be shared with Flyweight.
- Flyweight explains when and how State objects can be shared.
Mẫu ”hạng ruồi” flyweight giúp cho một đối tượng trông giống nhiều đối tượng.
Mẫu singleton
nói về việc tạo một đối tượng duy nhất. Có một mẫu
thiết kế khác cũng hạn chế việc tạo đối tượng, nhưng lần này nó sẽ đem
đến một cách thức khác trong việc viết mã. Đó là mẫu “hạng ruồi”
flyweight.
Mẫu thiết kế này gọi là “hạng ruồi” flyweight
nguyên do thay vì phải
làm việc với nhiều đối tượng độc lập, to lớn, bạn giảm bớt kích thước
chúng bằng việc tạo một tập hợp các đối tượng dùng chung nhỏ hơn, gọi là
flyweight mà bạn có thể cài đặt vào lúc thực thi chương trình để chúng
trông giống như những đối tượng lớn hơn. Mỗi đối tượng to lớn có thể
tiêu tốn nhiều tài nguyên hệ thống, bằng cách tách những điểm giống nhau
của các đối tượng này, và dựa trên việc cấu hình thời gian thực để mô
phỏng lại các đối tượng lớn, bạn đã làm giảm bớt gánh nặng lên tài
nguyên hệ thống.
Bạn có thể đem những phần riêng biệt ra khỏi mã nguồn của những đối
tượng to lớn và tạo ra những đối tượng flyweight. Khi làm điều này, bạn
đã chấm dứt việc sử dụng nhiều đối tượng có chung các đặc điểm, và giảm
xuống việc chỉ sử dụng một đối tượng, có thể cài đặt khi chương trình
thực thi, mô phỏng lại cả tập hợp các đối tượng to lớn ban đầu
Ghi nhớ: Sách GoF đã định nghĩa mẫu
flyweight như sau: “Sử
dụng việc chia sẻ để giúp cho việc xử lý các đối tượng lớn một cách hiệu
quả” Họ cũng nói rằng: “Một mẫu flyweight là một đối tượng chia sẻ mà
có thể sử dụng trong đồng thời nhiều ngữ cảnh. Mẫu flyweight hoạt động
như một đối tượng độc lập trong mỗi thời điểm.
Đây là những gì diễn ra. Bạn bắt đầu với một tập hợp nhiều đối tượng
to lớn trong mã nguồn. Bạn gỡ bỏ những phần dùng chung, đóng gói chúng
vào một đối tượng chia sẻ, một flyweight, đối tượng này hoạt động như
một khuôn mẫu. Đối tượng khuôn mẫu này có thể được cài đặt vào lúc thực
thi chương trình bằng cách chuyển các đặc điểm dùng chung vào đối tượng flyweight
để nó xuất hiện giống như một hay nhiều đối tượng lớn ban đầu.
Bạn có thể thấy như hình vẽ sau:
Từ những đối tượng to lớn, bạn tạo một đối tượng nhỏ hơn gọi là flyweight (trong ví dụ này là một flyweight, tùy nhiên tùy thuộc vào ứng dụng mà bạn có thể có nhiều flyweight), mà bạn có thể cài đặt vào lúc chương trình hoạt động như hình sau:
Bất cứ khi nào bạn phải xử lý một lượng lớn các đối tượng, mẫu Flyweight
sẽ xuất hiện trong tâm trí bạn. Nếu bạn có thể tách những nội
dung giống nhau cần thiết từ những đối tượng này, và tạo một flyweight,
hoặc nhiều flyweight, mà hoạt động giống những khuôn mẫu, thì đó chính
là cách mẫu flyweight hoạt động
Ví dụ rằng, ở cương vị một chuyên gia thiết kế mẫu, bạn được chọn để
giảng dạy về mẫu thiết kế cho một lớp học. Chương trình mà bạn cần có để
theo dõi hồ sơ học viên cho từng học viên có thể là những đối tượng
thật sự lớn. Bạn quyết định đã đến lúc tiết kiệm tài nguyên hệ thống. Đó
là công việc của mẫu Flyweight.
Tạo một học viên
Để 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:
public class cStudent {
string _name;
string _id;
double _score;
double _average;
public double getStading()
{
return (double)((double)(_score / _average) - 1) * 100;
}
public double Score
{
get { return _score; }
set { _score = value; }
}
public string Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public cStudent(double averageScrore)
{
_average = averageScrore;
}
}
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:
static void Main(string[] args)
{
string[] names = { "Zidane", "Mark", "Sophia" };
string[] ids = {"1001", "1002", "1003"};
double[] scores = { 27, 67, 45 };
double total = 0;
for (int i = 0; i < scores.Length; i++)
total += scores[i];
double average = total / scores.Length;
cStudent student = new cStudent(average);
for (int i = 0; i < scores.Length; i++)
{
student.Id = ids[i];
student.Name = names[i];
student.Score = scores[i];
Console.WriteLine("Name: " + student.Name);
Console.WriteLine("ID: " + student.Id);
Console.WriteLine("Standing: " + Math.Round(student.getStading()));
Console.WriteLine(" ------------------------ ");
}
Console.ReadLine();
}
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.
Ref
https://sourcemaking.com/design_patterns/flyweight
https://haihth.wordpress.com/2013/02/23/dp-chapter5/
Thank you for reading this post. I hope you found it helpful and easy to follow. If you have any feedback or questions about
Design Pattern - Flyweight Pattern ,
please share them in the comments below. I would love to hear from you and discuss this topic further
✋✋✋✋
Webzone Tech Tips, all things Tech Tips for web development
- I am Zidane, See you next time soon ✋✋✋✋