Flyweight pattern là gì

  -  

Trong một số tình huống trong phát triển phần mềm, chúng ta có thể cải thiện hiệu suất của ứng dụng với việc sử dụng Cache. Hãy tưởng tượng rất nhiều đối tượng được tạo ra và lãng phí bộ nhớ. Mô hình Flyweight được tạo ra để tránh vấn đề này và tối ưu hóa hiệu suất.

Bạn đang xem: Flyweight pattern là gì


Flyweight Pattern là gì?

Use sharing to support large numbers of fine-grained objects efficiently.

Flyweight Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép tái sử dụng đối tượng tương tự đã tồn tại bằng cách lưu trữ chúng hoặc tạo đối tượng mới khi không tìm thấy đối tượng phù hợp.

Flyweight Pattern được sử dụng khi chúng ta cần tạo một số lượng lớn các đối tượng của 1 lớp nào đó. Do mỗi đối tượng đều đòi hỏi chiếm giữ một khoảng không gian bộ nhớ, nên với một số lượng lớn đối tượng được tạo ra có thể gây nên vấn đề nghiêm trọng đặc biệt đối với các thiết bị có dung lượng nhớ thấp. Flyweight Pattern có thể được áp dụng để giảm tải cho bộ nhớ thông qua cách chia sẻ các đối tượng. Vì vậy performance của hệ thống được tối ưu.

Flyweight object là immutable, nghĩa là không thể thay đổi khi nó đã được khởi tạo.

Xem thêm: Bộ Công Thương Tên Tiếng Anh Là Gì, Bộ Công Thương Tiếng Anh Là Gì

Hai trạng thái của Flyweight Object

Trạng thái của flyweight object là một phần quan trọng trong việc thiết kế Flyweight Pattern. Mục tiêu chính của Flyweight Pattern là giảm bộ nhớ bằng cách chia sẽ các đối tượng. Điều này có thể đạt được bằng cách tách các thuộc tính của đối tượng thành hai trạng thái: độc lập và phụ thuộc. Hay còn gọi là Intrinsic (trạng thái nội tại) và Extrinsic (trạng thái bên ngoài).

Intrinsic State (trạng thái nội tại) : Trạng thái này chứa dữ liệu không thể thay đổi (unchangeable) và không phụ thuộc (independent) vào ngữ cảnh (context) của đối tượng Flyweight . Những dữ liệu đó có thể được lưu trữ vĩnh viễn bên trong đối tượng Flyweight. Vì vậy mà Flyweight object có thể chia sẻ. Dữ liệu nội tại là phi trạng thái (stateless) và thường không thay đổi (unchanged). Tính năng này cho phép khả năng tái tạo các thuộc tính đối tượng Flyweight giữa các đối tượng tương tự khác. Điều quan trọng cần lưu ý là các đối tượng Flyweight chỉ nên nhận trạng thái bên trong của chúng thông qua các tham số của hàm tạo và không cung cấp các phương thức setter hay các biến public.Extrinsic State (trạng thái bên ngoài) : Trạng thái bên ngoài thể hiện tính chất phụ thuộc ngữ cảnh của đối tượng flyweight. Trạng thái này chứa các thuộc tính và dữ liệu được áp dụng hoặc được tính toán trong thời gian thực thi (runtime). Do đó, những dữ liệu đó không được lưu trữ trong bộ nhớ. Vì trạng thái bên ngoài là phụ thuộc ngữ cảnh và có thể thay đổi nên các đối tượng đó không thể được chia sẻ. Do đó, client chịu trách nhiệm truyền dữ liệu liên quan đến trạng thái bên ngoài cho đối tượng flyweight khi cần thiết, có thể thông qua các tham số (argument).

Xem thêm: Hợp Long Là Gì ? Việc Phân Chia Các Đốt Đúc Của Dầm Đúc Hẫng

Tóm lại, tốt nhất là xem xét cách mỗi dữ liệu hoạt động bên trong đối tượng khi tạo đối tượng flyweight. Nghĩa là thành phần nào không được thay đổi, cần lưu trữ, thành phần nào không được thay đổi, không cần lưu trữ. Điều này giúp cho chúng ta tiết kiệm được bộ nhớ và thực thi được hiệu quả.

Cài đặt Flyweight Pattern như thế nào?

*

ISoldier.java

package com.hufa.edu.vn.patterns.structural.flyweight;/** * Flyweight */public interface ISoldier {void promote(Context context);}Context.java

package com.hufa.edu.vn.patterns.structural.flyweight;/** * Extrinsic State */public class Context {private String id;private int star;public Context(String id, int star) {this.id = id;this.star = star;}public String getId() {return this.id;}public int getStar() {return this.star;}}Soldier.java

package com.hufa.edu.vn.patterns.structural.flyweight;/** * Concrete Flyweight */public class Soldier implements ISoldier {private final String name; // Intrinsic Statepublic Soldier(String name) {this.name = name;System.out.println("Soldier is created! - " + name);}