2013-05-25 46 views
13

Hai mẫu có vẻ như cũng đạt được điều tương tự. Các trường hợp sử dụng khác nhau trong thế giới thực là gì? Cảm ơnSự khác biệt sử dụng thực tế giữa các mẫu Flyweight và Singleton là gì?

+2

Khi tôi nghĩ về Singleton, tôi nghĩ về "biến toàn cục". Khi tôi nghĩ về Flyweight, tôi nghĩ về "con trỏ". – jxh

+0

Họ không đạt được điều tương tự. – Jayan

+0

Bạn nghĩ điều gì là đạt được? Các mẫu trông khá khác với tôi. – Bergi

Trả lời

12

Một singleton thường có thể thay đổi. Điều đó là không thể với một trọng lượng. Ví dụ. một con ruồi có thể đại diện cho một màu. Nó sẽ gây nhầm lẫn nếu bạn tạo ra một màu đỏ và nó là màu xanh lá cây thay vì đối tượng thừa cân cơ bản của nó đã được thay đổi sang màu xanh lá cây ở một nơi khác trong mã.

Ngoài ra tôi có thể nói một singleton là loại mô hình con của ruồi. Bạn có thể nghĩ rằng các đối tượng màu sắc riêng lẻ là các bộ đơn, nhưng chúng đều là một phần của một hệ thống mà bạn sử dụng một nhà máy để chọn đối tượng đơn/ruồi bên phải.

Nó thực sự là rất nhiều về sự lừa dối. Các bảng xếp hạng không được trình bày cho người dùng API như thể chúng là các đối tượng duy nhất, trong khi đó các đĩa đơn là.

Ví dụ từ Cocoa (Objective-C):

UIApplication.sharedApplication.statusBarHidden = YES 

Đây rõ ràng là một đối tượng duy nhất và bạn có thể thay đổi trạng thái của nó.

UIColor *red = [UIColor redColor] 

Người dùng không cần biết màu đỏ là đơn hay không vì không thay đổi. Bạn không thể thay đổi các đối tượng màu sau khi chúng được tạo ra. Vì vậy, nó không tạo sự khác biệt thực tế cho người dùng dù họ là người độc thân hay bạn tạo ra các đối tượng mới. Vì vậy, nó có ý nghĩa hơn để gọi đây là một trọng lượng. Đó là tất cả về ý định.

+1

+1. Mutable. đó là chìa khóa. – Jayan

+0

@Jayan Phím tắt là gì? Tôi đã thấy và tạo ra rất nhiều đĩa đơn không thay đổi. Ví dụ nhà máy hoặc thùng chứa tài sản. Đây là một câu trả lời hay, và đó có thể là một quy tắc công bằng, nhưng có rất nhiều lý do để sử dụng một singleton bất biến. –

+0

Nếu bạn đọc giải thích về trọng lượng trên wikipedia, mô tả rất khác với những gì bạn mô tả ở đây. IMO, chúng hoàn toàn không liên quan. http://en.wikipedia.org/wiki/Flyweight_pattern –

11

Cân nặng là khi bạn có nhiều loại khác nhau của một điều duy nhất.

Singleton là khi bạn có một thứ duy nhất.

Ví dụ: bạn có thể sử dụng Mẫu hình đại diện để đại diện cho các ký tự bàn phím. Một đối tượng cho a, một cho b, v.v. Chúng là cả hai ký tự, nhưng khác nhau các loại ký tự.

Ngược lại, bạn có thể sử dụng một singleton để đại diện cho bàn phím. Chỉ có thể có một.

4

Họ không liên quan:

hạng ruồi được tái sử dụng (rõ ràng là bất biến) các trường hợp của một lớp học bất cứ nơi nào có thể, thay vì tạo ra các trường hợp mới của một lớp học với những "giá trị" cùng, giúp tiết kiệm CPU và bộ nhớ.

Singleton là khi chỉ có một thể hiện của một lớp (thường là có thể thay đổi). Nó thường được sử dụng trong các môi trường đa luồng để tạo thuận lợi cho tất cả các luồng sử dụng một cá thể đơn và "nhìn thấy" cùng một trạng thái.

+0

Whoa, whoa, whoa. Nói "nó là * thường * được sử dụng" và "nó được sử dụng" là hai điều hoàn toàn khác nhau. Có rất nhiều lý do ngoài luồng để sử dụng một singleton. Ví dụ, đối với một số hoạt động tốn kém mà bạn chỉ muốn thực hiện một lần. –

+0

@TimPote Tốt. "thường" đã được thêm vào. – Bohemian

2

Trọng lượng được sử dụng khi có sự phân biệt rõ ràng về trạng thái bên trong và bên ngoài của đối tượng tồn tại. Trạng thái bên trong có thể được chia sẻ giữa các đối tượng bên ngoài khác. Ví dụ, một tiêu đề của các tài liệu có thể được phân loại là trạng thái bên trong của đối tượng và có thể được chia sẻ trên. Nhưng phần còn lại của dữ liệu trong tài liệu có thể rất năng động và được lấp đầy bởi người dùng (dữ liệu bên ngoài). Để đại diện cho dữ liệu nội tại, một vật thể bay có thể được tạo ra và duy trì bên trong nhà máy sản xuất đạn. Đối tượng nhà máy Flyweight sẽ phục vụ như là bộ sưu tập của flyweight (tiêu đề đối tượng) và có thể được dân cư trước đó và chia sẻ trên các trường hợp khác nhau của tài liệu trong trường hợp của chúng tôi.

1

Đừng quên rằng singleton là một mẫu hình sáng tạo, trong khi ruồi là một mẫu cấu trúc. Do đó, mục tiêu của hai mẫu là hoàn toàn khác nhau

+0

Chính xác. Xin lỗi, tôi không thấy câu trả lời này khi tôi đăng bài của tôi nhưng tôi đã mở rộng câu trả lời của bạn. –

0

Hai mẫu này hoàn toàn khác "mẫu Loại". Singleton là một mẫu "TẠO". Các mẫu sáng tạo là thứ tự phổ biến hơn trong các phương pháp "Tạo đối tượng". Mặt khác, Flyweight là một "mô hình kết cấu". Các mẫu kết cấu phải làm nhiều hơn với các giao diện và thực hiện hơn là "tạo đối tượng". Một cách dễ dàng hơn để mô tả sự khác biệt là kiểu mẫu đầu tiên "Các mẫu tạo" có nhiều danh từ hơn. Kiểu "Mô hình kết cấu" thứ hai có nhiều động từ hơn.

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