2009-04-07 4 views
28

Tôi đã thử một vài lần để hiểu Singleton là gì. Có lẽ tôi chỉ là quá trực quan .. vì vậy bất cứ ai có thể phá vỡ nó xuống trong một tương tự đơn giản.Vâng .. Tôi biết .. Tôi là một người đơn giản .. Vậy Singleton là gì?

bài viết tương tự:

+4

Trước khi bạn bắt đầu sử dụng Singletons ở khắp mọi nơi, vui lòng đọc bài đăng này: http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons :-) –

+0

Trong C++, nếu bạn khai báo biến thành 'tĩnh', bạn đang tạo một singleton một cách hiệu quả. – slashmais

Trả lời

67

Theo yêu cầu, đây là một vài điểm tương đồng:.

  • Trái đất
  • The Universe
  • Oxy nguyên tố (có những yếu tố khác, nhưng chỉ có một oxy Có rất nhiều các phân tử oxy, nhưng chỉ có một yếu tố oxy kinh điển.)
  • Khái niệm True
  • Khái niệm về False

Bạn có thể khởi tạo nhiều đối tượng True, nhưng tất cả chúng sẽ chỉ đến cùng một mục thực tế (tức là khái niệm chung của True).Tùy thuộc vào miền ứng dụng của bạn, có thể có những ví dụ cụ thể hơn:

  • Kết nối cơ sở dữ liệu
  • chủ đề chính của ứng dụng
  • Bất cứ điều gì mà đại diện cho một thiết bị phần cứng (ví dụ bạn chỉ muốn thể hiện hóa một đối tượng đại diện CPU0) .
+2

Tôi không chắc chắn so sánh với oxy là thích hợp; có rất nhiều phân tử có cùng cấu hình với nhau, chúng tôi phân loại thành oxy, và chúng là tất cả các phân tử riêng biệt có thể được điều khiển độc lập với nhau. – Rob

+14

Nhà hóa học. Các chuyên ngành nghệ thuật tự do sẽ phàn nàn về việc tôi sử dụng True và False là những người phổ thông. Sci-fi folks sẽ phàn nàn rằng tôi đã bỏ lỡ đa vũ trụ. OP có ý nghĩa của tôi. :-) – runako

+0

Tôi không chắc chắn về kết nối cơ sở dữ liệu, nó vi phạm "Mọi ứng dụng sẽ chỉ cần một phiên bản của lớp này?" từ bài đăng của tôi. Bạn có thể muốn thực hiện nhiều lần một yêu cầu, trên nhiều kết nối. – Martin

18

Singleton là một lớp trong đó chỉ có thể có một ví dụ trong ứng dụng của bạn. Sau đó, bạn chia sẻ ví dụ đó trong suốt ứng dụng của mình.

Dưới đây là một liên kết có thể giúp (bao gồm làm thế nào để làm chủ đề singleton của bạn an toàn trong C# cũng):

Implementing the Singleton Pattern in C#

+0

Vì vậy, nó giống như một lớp chỉ đọc? – madcolor

+0

Không. Đó là một lớp đơn thể, tức là nó vẫn tồn tại ở một nơi duy nhất trong bộ nhớ, bất kể ai gọi nó. –

+0

Ahh .. in .Net sẽ context.items tương tự? – madcolor

1

Google và Wikipedia, người bạn tốt nhất của bạn:

http://en.wikipedia.org/wiki/Singleton_pattern

+3

Một người bạn thân nhất khác: những người hữu ích tại stackoverflow;) –

+1

Đồng ý. Đã học nhiều hơn trong sáu tháng qua so với nhiều năm trước. –

0

Bên cạnh vị trí của nó như là một mẫu thiết kế đặc biệt, đơn cũng có thể được coi là đơn giản một điều. Việc sử dụng nó trong lập trình không nghi ngờ gì xuất phát từ việc sử dụng nó trong toán học, trong đó singleton là một tập hợp chỉ một số.

+0

Hoặc có lẽ từ việc sử dụng nó trong tiếng Anh hàng ngày? –

+0

@Neil: Chỉ một lập trình viên mới có thể nói điều gì đó như vậy ... –

13

Singleton rất hữu ích khi bạn phải hãy chắc chắn rằng có một chỉ có một thể hiện của một lớp học, và rằng đối tượng này phải được truy cập từ nhiều địa điểm trong các mã.

Nếu có thể có ý nghĩa rằng nhiều hơn một thể hiện của lớp học của bạn có thể được sử dụng cùng một lúc, thì bạn không muốn một singleton.

Dưới đây là một số thông tin về nơi để sử dụng độc thân: http://www.ibm.com/developerworks/webservices/library/co-single.html

Từ bài báo đã đề cập trước:

Để quyết định xem một lớp học thực sự là một singleton , bạn phải tự hỏi mình một số câu hỏi .

  • Mỗi ứng dụng có sử dụng lớp này chính xác không? (chính xác là từ khóa)
  • Mọi ứng dụng sẽ chỉ cần một phiên bản của lớp này?
    (bao giờ và một là những từ khóa)
  • Nếu khách hàng của lớp này không biết về ứng dụng, họ là
    một phần của?

    Nếu bạn trả lời có cho cả ba câu hỏi, thì bạn đã tìm thấy một singlet . Các điểm chính ở đây là rằng một lớp chỉ là một singleton nếu tất cả các ứng dụng xử lý chính xác số giống nhau và nếu khách hàng của nó có thể sử dụng lớp mà không có ngữ cảnh ứng dụng.

+0

+1 để giải thích * động cơ * –

+0

Một khía cạnh quan trọng khác là bạn có thể nhổ chiếc đĩa đơn ra khỏi không khí từ bất cứ nơi nào trong mã và lấy cùng một vật thể. Vì vậy, thật dễ dàng để gọi lên một con trỏ/tham chiếu đến cùng một đối tượng đơn lẻ toàn cầu từ bất kỳ hàm nào - vì điều này thường được sử dụng cho các thiết lập chung. Chỉ cần suy nghĩ về tính độc đáo là một chút hạn chế, tên singleton là hơi gây hiểu lầm. –

1

Một singleton là một lớp học, mà chỉ có thể có một trường hợp duy nhất được tạo ra.

Điều này thường được thực hiện bằng cách có một hàm tạo riêng, được gán cho một biến tĩnh và sau đó có thể truy cập thông qua một phương thức công khai.

Có một số vấn đề với việc sử dụng độc thân, bao gồm:

  • Họ làm cho thử nghiệm khó khăn
  • Họ không thể phụ xếp
  • Khi khởi tạo, các trường hợp sẽ sống mãi mãi

Xem ở đây để biết thêm mô tả về singleton và một mẫu khác 'Kiếm tiền' có thể hữu ích thay thế: http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

0

Singleton đôi khi có thể không phải như vậy duy nhất. Hãy xem tại đây: When a singleton is not a Singleton?, bài viết do Sun cung cấp.

Một đề xuất: Không sử dụng. Nó chỉ là không tốt, có thể tạo ra tắc nghẽn hiệu suất nghiêm trọng trong ứng dụng của bạn, và nỗ lực để kiểm tra các lớp singleton chỉ là không có giá trị nó.

Từ bài viết Wikipedia nêu trên:

Cần lưu ý rằng mô hình này làm cho kiểm tra đơn vị khó khăn hơn nhiều, vì nó giới thiệu tình trạng toàn cầu vào một ứng dụng.

Tài nguyên khác đáng xem là this post trên blog thử nghiệm của google.

0

Có một tuyệt vời Google Tech Talk nơi loa giải quyết tình trạng toàn cầu (bao gồm cả Singletons) và tại sao họ làm thử nghiệm gần như không thể:

The Clean Code Talks - "Global State and Singletons"

Người nói làm cho một sự phân biệt giữa những gì ông gọi Singletons (vốn 'S'), nơi các bước được thực hiện để ngăn chặn các lớp được instantiated nhiều hơn một lần (tức là, thường với một phương pháp tĩnh getInstance và tư nhân), và singletons (nhỏ 's'), nơi một trường hợp duy nhất là tất cả những gì là cần thiết, nhưng không có gì được xây dựng trong lớp để ngăn chặn nhiều phiên bản từ b eing đã được tạo.