2015-08-22 12 views
5

Tôi bắt đầu tìm hiểu các mẫu thiết kế. Tôi hiểu rằng nguyên mẫu là để làm một bản sao chính xác của một đối tượng tôi đã có và Flyweight là để làm cho các đối tượng tương tự.Nguyên mẫu vs Flyweight

Tôi đã lập trình trò chơi platformer 2D như Mario (trong Java). Có rất nhiều kẻ thù khác nhau duy nhất là vị trí của họ [x,y]. Ngoài ra còn có các bức tường được xây dựng từ một số lượng lớn các hình chữ nhật và một lần nữa sự khác biệt duy nhất là vị trí của chúng [x,y].

Bạn có nên sử dụng một số mẫu thiết kế này trong tình huống cụ thể này không? Tôi có nên sử dụng nguyên mẫu để sao chép các đối tượng thông qua cloneable và sau đó thiết lập [x,y]?

Có tốt hơn khi sử dụng cân thừa - khi tôi cần đối tượng mới, tôi chỉ trả lại chúng từ hashmap của tôi và sau đó đặt [x, y]?

Trong cả hai trường hợp, tôi tránh sử dụng toán tử mới nhưng tôi không chắc chắn nên sử dụng toán tử nào.

Trả lời

6

Bạn đã nhầm một chút. Prototype được sử dụng để tạo các phiên bản mới, Flyweight được sử dụng để cho phép chia sẻ các phiên bản.

Không phải ví dụ tốt nhất, nhưng trò chơi thông minh Prototype có nghĩa là bạn có EnemyPrototype (hoặc một số) và bạn tạo một kẻ thù mới từ đó. Trong một thực hiện ngây thơ này sẽ lặp lại tất cả các dữ liệu, bao gồm cả đồ họa. Vì vậy, đối với 100 kẻ thù bạn sẽ có cùng một hình ảnh 100 lần trong bộ nhớ (không phải là một điều tốt).

Đối với Flyweight, bạn sẽ chia sẻ đồ họa. Không thực sự là một ví dụ rất tốt cho mô hình Flyweight, vì nó có thể được giải quyết dễ dàng hơn mà không cần bất kỳ mẫu nào (chỉ cần lấy tham chiếu đến hình ảnh từ bản đồ hoặc nhà máy hoặc bất kỳ thứ gì).

Để tránh nhà điều hành new, không cần thiết. Không có lợi thế khi sử dụng clone() trên new, thay vào đó có một số nhược điểm.

0

Nguyên mẫu nổi lên để giảm chi phí sáng tạo. Vì, 'nhân bản' không có nhiều lợi ích khi sử dụng toán tử 'mới' (có thể còn tồi tệ hơn do sao chép, đúc vv), lợi ích thực sự có thể là loại bỏ các hoạt động nặng (như truy cập db) trong khi sự sáng tạo.

Nguyên mẫu cũng mang lại (ít nhất là với tôi) sự nhầm lẫn là 'nông' hoặc 'sâu' đối với các đối tượng nhân bản vô tính.

Trong trường hợp của bạn, tôi nghĩ rằng việc chia sẻ đồ họa hình ảnh thông qua Flyweight là khôn ngoan và tôi sẽ đi cho một Flyweight hoặc Object Pool khác cho đối tượng chính.

Các vấn đề liên quan