Background
Break News
How to add local font to Tailwind Css and NextJS? - Tutorial Design Pattern? - Blockchain Technology, How to create own Bitcoin virtual currency - Zustand mordern management state - Design Pattern - Flyweight Pattern? - Docker Full training Topic

[Tutorial] Design Pattern - Flyweight Pattern

Monday 1 August 2016
|
Read: Completed in minutes

[Tutorial] Design Pattern - Flyweight Pattern

"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.




Design Pattern - Flyweight Pattern

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:

Design Pattern - Flyweight Pattern



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 ✋✋✋✋

🙇🏼 We Appreciate Your Comments and Suggestions - Webzone - all things Tech Tips web development 🙇🏼
Popular Webzone Tech Tips topic maybe you will be like it - by Webzone Tech Tips - Zidane
As a student, I found Blogspot very useful when I joined in 2014. I have been a developer for years . To give back and share what I learned, I started Webzone, a blog with tech tips. You can also search for tech tips zidane on Google and find my helpful posts. Love you all,

I am glad you visited my blog. I hope you find it useful for learning tech tips and webzone tricks. If you have any technical issues, feel free to browse my posts and see if they can help you solve them. You can also leave a comment or contact me if you need more assistance. Here is my blog address: https://learn-tech-tips.blogspot.com.

My blog where I share my passion for web development, webzone design, and tech tips. You will find tutorials on how to build websites from scratch, using hot trends frameworks like nestjs, nextjs, cakephp, devops, docker, and more. You will also learn how to fix common bugs on development, like a mini stackoverflow. Plus, you will discover how to easily learn programming languages such as PHP (CAKEPHP, LARAVEL), C#, C++, Web(HTML, CSS, javascript), and other useful things like Office (Excel, Photoshop). I hope you enjoy my blog and find it helpful for your projects. :)

Thanks and Best Regards!
Follow me on Tiktok @learntechtips and send me a direct message. I will be happy to chat with you.
Webzone - Zidane (huuvi168@gmail.com)
I'm developer, I like code, I like to learn new technology and want to be friend with people for learn each other
I'm a developer who loves coding, learning new technologies, and making friends with people who share the same passion. I have been a full stack developer since 2015, with more than years of experience in web development.
Copyright @2022(November) Version 1.0.0 - By Webzone, all things Tech Tips for Web Development Zidane
https://learn-tech-tips.blogspot.com