Flyweight Pattern Là Gì

     

Mục tiêu

Flyweight là một mẫu thiết kế cấu trúc cho phép chúng ta lắp nhiều đối tượng người tiêu dùng hơn vào dung lượng RAM bao gồm sẵn bằng phương pháp chia sẻ những phần trạng thái thông thường giữa nhiều đối tượng thay do giữ tất cả dữ liệu trong những đối tượng.

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


*
*

Đặt vấn đề

Để vui chơi sau hầu hết giờ làm việc dài, bạn đưa ra quyết định tạo một trò nghịch điện tử 1-1 giản: fan chơi sẽ dịch chuyển quanh phiên bản đồ và bắn lẫn nhau. Chúng ta đã chọn thực thi một hệ thống hạt (particle system) thực tiễn và trở thành nó thành một tính năng quan trọng của trò chơi. Số lượng lớn đạn, tên lửa với mảnh đạn từ các vụ nổ sẽ bay khắp bản đồ và mang đến trải nghiệm ly kỳ cho tất cả những người chơi.

Sau khi hoàn thành, bạn đã push commit cuối cùng, built trò đùa và gửi nó cho bằng hữu của các bạn để kiểm thử. Tuy nhiên trò chơi đang làm việc hoàn hảo trên trang bị của bạn, nhưng mà bạn của chúng ta không thể nghịch lâu. Trên laptop của anh ấy, trò chơi tiếp tục bị lỗi sau vài ba phút chơi. Sau thời điểm dành một vài giờ để tra cứu kiếm gỡ lỗi, bạn phát chỉ ra rằng trò chơi bị lỗi vày không đủ dung tích RAM. Hóa ra là thiết bị của anh ta nhát hơn những so với sản phẩm tính của doanh nghiệp và đó là nguyên nhân tại sao vấn khuyến cáo hiện rất cấp tốc trên máy của anh ý ấy.

Vấn đề thực tế liên quan lại đến hệ thống hạt của bạn. Từng hạt, chẳng hạn như một viên đạn, một thương hiệu lửa hoặc một mảnh đạn được thể hiện bởi một đối tượng hiếm hoi chứa nhiều dữ liệu. Tại một số trong những thời điểm, khi sự tàn ngay cạnh trên màn hình hiển thị của người chơi lên tới đỉnh điểm, những hạt mới được tạo thành ra không còn đủ với bộ nhớ lưu trữ RAM còn lại, vày đó, chương trình bị lỗi.


*
*

Giải pháp

Khi bình chọn kỹ hơn lớp Particle, chúng ta có thể nhận thấy rằng các trường màu với sprite tiêu hao nhiều bộ nhớ lưu trữ hơn những trường khác. Điều xấu đi là hai trường này tàng trữ dữ liệu ngay sát như giống hệt nhau trên tất cả các hạt. Ví dụ, tất cả các viên đạn gồm cùng màu với sprite.


*
*

Các phần không giống của tâm lý hạt, chẳng hạn như tọa độ, vectơ chuyển động và tốc độ, là duy nhất cho mỗi hạt. Rốt cuộc, giá trị của các trường này biến hóa theo thời gian. Dữ liệu này đại diện thay mặt cho bối cảnh luôn biến đổi trong kia hạt tồn tại, trong khi màu sắc và sprite ko đổi đối với mỗi hạt.

Dữ liệu không thay đổi này của một đối tượng thường được call là tâm trạng nội tại (intrinsic). Nó sống phía bên trong đối tượng; các đối tượng người dùng khác chỉ hoàn toàn có thể đọc nó, không biến đổi nó. Phần sót lại của tinh thần của đối tượng, thường bị đổi khác “từ bên ngoài” do các đối tượng người sử dụng khác, được gọi là trạng thái ngoại vi (extrinsic).

Mẫu Flyweight khuyến nghị rằng bạn dứt lưu trữ trạng thái bên ngoài bên vào đối tượng. Nuốm vào đó, chúng ta nên chuyển tâm lý này cho những phương thức cụ thể dựa vào nó. Chỉ trạng thái nội tại phía trong đối tượng, được cho phép bạn thực hiện lại nó trong những ngữ cảnh khác nhau. Do đó, bạn sẽ cần ít đối tượng người tiêu dùng này hơn vì chúng chỉ khác biệt về tâm lý nội tại, tất cả ít biến hóa thể hơn những so với nước ngoài vi.


*
*

Hãy trở về trò nghịch của bọn chúng ta. Trả sử rằng chúng ta đã trích xuất trạng thái phía bên ngoài từ lớp Particle của mình, chỉ cần ba vật thể không giống nhau là đầy đủ để đại diện thay mặt cho toàn bộ các hạt trong trò chơi: một viên đạn, một thương hiệu lửa cùng một mảnh đạn. Như bạn cũng có thể đã đoán ra, một vật thể chỉ tàng trữ trạng thái bên phía trong được gọi là flyweight.

Lưu trữ trạng thái bên ngoài

Trạng thái bên phía ngoài di chuyển mang đến đâu? một vài lớp vẫn nên lưu trữ nó, cần không? Trong đa số các ngôi trường hợp, nó được đưa đến đối tượng người tiêu dùng container, đối tượng này tổng đúng theo các đối tượng trước khi họ áp dụng mẫu.

Xem thêm: Cách Cúng Sao Thái Bạch Nên Làm Gì, Có Đáng Lo Như Bạn Nghĩ?

Trong trường thích hợp của bọn chúng ta, kia là đối tượng người sử dụng Game lưu lại trữ tất cả các phân tử trong trường hạt. Để chuyển trạng thái bên ngoài vào lớp này, bạn cần tạo một trong những trường mảng để tàng trữ tọa độ, vectơ và tốc độ của từng phân tử riêng lẻ. Mà lại đó không phải là vớ cả. Bạn cần một mảng khác nhằm lưu trữ những tham chiếu cho một flyweight ví dụ đại diện cho một hạt. Những mảng này đề xuất được đồng điệu để bạn cũng có thể truy cập tất cả dữ liệu của một hạt bằng cách sử dụng và một chỉ mục.


*
*

Một phương án thanh kế hoạch hơn là tạo nên một lớp ngữ cảnh đơn lẻ sẽ tàng trữ trạng thái phía bên ngoài cùng cùng với tham chiếu đến đối tượng người tiêu dùng flyweight. Cách tiếp cận này đang yêu cầu chỉ có một mảng nhất trong lớp container.

Đợi một chút! chúng ta chẳng cần phải có rất nhiều đối tượng ngữ cảnh này như bọn họ đã bao gồm ngay từ đầu sao? Về khía cạnh kỹ thuật là đúng. Nhưng gồm điều, gần như vật thể này bé dại hơn trước siêu nhiều. Các trường thực hiện nhiều bộ nhớ nhất đang được đưa đến có một vài đối tượng flyweight. Giờ đây, một nghìn đối tượng ngữ cảnh nhỏ dại có thể tái sử dụng một đối tượng người dùng flyweight hạng nặng duy nhất vậy vì lưu trữ một nghìn bạn dạng sao dữ liệu của nó.

Flyweight cùng tính bất biến

Vì thuộc một đối tượng người dùng flyweight có thể được sử dụng trong số ngữ cảnh không giống nhau, chúng ta phải bảo đảm rằng trạng thái của nó cần thiết sửa đổi được. Một flyweight buộc phải khởi chế tác trạng thái của nó có một lần, thông qua các tham số của hàm tạo. Nó không được để lộ bất kỳ bộ cài đặt hoặc trường công khai minh bạch nào mang lại các đối tượng người tiêu dùng khác.

Flyweight factory

Để truy hỏi cập dễ dãi hơn vào các loại flyweight không giống nhau, bạn có thể tạo một phương thức factory để quản lý một đội các đối tượng người dùng flyweight hiện có. Phương thức gật đầu trạng thái nội trên của flyweight ước muốn từ client, search kiếm một đối tượng người tiêu dùng flyweight hiện có tương xứng với trạng thái này với trả về giả dụ nó được tra cứu thấy. Nếu như không, nó tạo nên một flyweight new và thêm nó vào pool.

Có một số tùy lựa chọn mà phương thức này hoàn toàn có thể được đặt vào. Nơi dễ thấy nhất là flyweight container. Kế bên ra, bạn cũng có thể tạo một tờ factory mới. Hoặc chúng ta có thể làm cho cách thức factory tĩnh và đặt nó bên phía trong một lớp flyweight thực tế.

Cấu trúc


Mẫu Flyweight chỉ đối kháng thuần là 1 trong những sự buổi tối ưu hóa. Trước lúc áp dụng nó, hãy bảo vệ rằng chương trình của doanh nghiệp có vấn đề tiêu thụ RAM tương quan đến bài toán có một vài lượng lớn các đối tượng tương từ bỏ trong bộ nhớ cùng một lúc. Đảm nói rằng vấn đề này sẽ không thể được xử lý theo bất kỳ cách làm sao có ý nghĩa khác.Lớp Flyweight chứa 1 phần trạng thái của đối tượng lúc đầu có thể được chia sẻ giữa các đối tượng. Thuộc một đối tượng người sử dụng flyweight rất có thể được sử dụng trong không ít ngữ cảnh khác nhau. Tinh thần được lưu giữ trữ bên phía trong flyweight được hotline là nội tại. Tâm lý được chuyển cho những phương thức của flyweight được hotline là ngoại vi.Lớp Context chứa trạng thái ngoại vi, duy nhất trên tất cả các đối tượng gốc. Lúc một ngữ cảnh được ghép nối với 1 trong các đối tượng người tiêu dùng flyweight, nó thể thực trạng thái vừa đủ của đối tượng người dùng ban đầu.Thông thường, hành động của đối tượng lúc đầu vẫn ở lớp flyweight. Vào trường đúng theo này, bất kỳ ai gọi cách tiến hành của flyweight cũng cần chuyển các bit phù hợp của trạng thái nước ngoài vi vào những tham số của phương thức. Mặt khác, hành vi có thể được chuyển sang lớp Context, lớp này sẽ sử dụng flyweight được links đơn thuần như một đối tượng dữ liệu.Client tính toán hoặc tàng trữ trạng thái ngoại vi của flyweight. Từ cách nhìn của client, flyweight là một đối tượng mẫu hoàn toàn có thể được định thông số kỹ thuật trong thời hạn chạy bằng cách truyền một trong những dữ liệu văn cảnh vào trong số tham số của các phương thức của nó.Flyweight Factory quản lý một đội các flyweight hiện nay có. Với factory, client không trực tiếp tạo ra trọng lượng bay. Cố kỉnh vào đó, chúng call factory, chuyển cho nó những bit về tâm trạng nội trên của flyweight ý muốn muốn. Factory xem xét những flyweight đã sản xuất trước đó với trả về một flyweight hiện tại có cân xứng với tiêu chí tìm kiếm hoặc tạo một flyweight bắt đầu nếu không tìm kiếm thấy gì.

Xem thêm: Font Chữ Trẻ Em Việt Hóa - Font Chữ Việt Hóa Tổng Hợp

Khả năng áp dụng

Chỉ sử dụng mẫu Flyweight lúc chương trình của công ty phải cung cấp một số lượng lớn các đối tượng hầu như không vừa cùng với RAM gồm sẵn.

Ưu với nhược điểm