728x90 AdSpace

  • Latest News

    [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, Facadeshows 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:


    Design Pattern - Flyweight Pattern



    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/

    • Blogger Comments
    • Facebook Comments

    0 comments:

    Post a Comment

    Item Reviewed: [Tutorial] Design Pattern - Flyweight Pattern Rating: 5 Reviewed By: Unknown
    Scroll to Top