Trong nền công nghiệp phần mềm, mô hình Singleton là 1 trong những mẫu xây cất phần mềm nhằm hạn chế sự khởi tạo ra của lớp (class) đối tượng. Điều này vô cùng hữu dụng khi nên một đối tượng chính xác để điều phối hành động trên toàn hệ thống. Khái niệm nhiều khi được bao quát hóa đến các khối hệ thống vận hành hiệu quả hơn lúc chỉ gồm một đối tượng người tiêu dùng tồn trên hoặc tiêu giảm sự khởi làm cho một số lượng đối tượng người tiêu dùng nhất định. Thuật ngữ này được bắt nguồn từ khái niệm toán học tập của một Singleton.Vậy Singleton pattern là gì? Singleton pattern dùng để làm gì? Có các cách nào nhằm implement singleton pattern? Singleton pattern được ứng dụng ở đâu? bọn họ cùng mày mò qua bài viết sau nhé!


*

Singleton pattern là gì?

Singleton pattern là gì?

Singleton pattern là một trong 5 kiến thiết pattern thuộc đội Creational kiến thiết Pattern.Singleton pattern bảo vệ chỉ độc nhất một diễn tả (instance) được tạo nên và bạn cũng có thể truy xuất được biểu hiện duy độc nhất đó hầu như lúc số đông nơi vào chương trình.

Bạn đang xem: Singleton là gì

*

Singleton có một instance duy nhất và được các class khác điện thoại tư vấn tới

Singleton pattern dùng để triển khai gì?

Việc thực hiện Singleton pattern để giúp chúng ta bảo đảm an toàn những điều sau đây:

Đảm bảo chỉ có một thể hiện tại (instance) của lớp (class).

Giúp làm chủ việc tầm nã cập giỏi hơn do chỉ có 1 thể hiện (instance) duy nhất.

Quản lý được con số thể hiện (instance) của một tờ (class) trong một số lượng giới hạn chỉ định.

Các phép tắc cơ phiên bản để implement Singleton pattern

Chúng ta tất cả rất nhiều phương pháp để implement Singleton pattern. Nhưng dù cho việc implement bằng cách nào đi nữa cũng cần phụ thuộc vào những nguyên tắc dưới cơ phiên bản dưới đây:

Dữ liệu instance (private và static) là đối tượng người tiêu dùng duy tốt nhất của lớp Singleton.

Private hoặc protected constructor nhằm mục tiêu hạn chế người dùng tạo instance trực tiếp từ lớp (class) bên ngoài.

Đặt private static final variable để bảo đảm biến chỉ được khởi tạo thành trong class.

Có một method public static nhằm return instance đã có khởi chế tạo ở trên.

9 phương pháp để implement Singleton pattern thịnh hành nhất

Dựa trên phần đa nguyên tắc xây đắp Singleton trên, họ có 9 giải pháp implement Singleton pattern sau:

Eager initialization (Khởi chế tác sớm)

Singleton Class sẽ được khởi tạo ngay trong khi chương trình chạy. Đây là cách dễ dãi nhất, dễ dàng và đơn giản nhất tuy vậy nó gồm một nhược điểm: tuy vậy instance đã có được khởi tạo ra nhưng hoàn toàn có thể sẽ không cần sử dụng tới.

Ví dụ:

*

Eager initialization dễ thiết đặt nhưng nó thuận tiện bị phá vỡ vì chưng Reflection

Static block initialization

Chúng ta làm tương tự như như Eager initialization chỉ khác ở vị trí static block cung cấp thêm chọn lựa cho câu hỏi handle exception hay các xử lý khác.

Ví dụ:

*

Lazy Initialization

Lazy Initialization thành lập đã giúp khắc phục nhược điểm của Eager Initialization. Chỉ bao giờ được gọi, instance mới được khởi tạo. Nó giúp cho bạn không phải tạo lập class khi chúng ta không cần. Tuy nhiên, đối với thao tác create instance quá chậm rãi thì người dùng rất có thể phải mong ngóng cho lần áp dụng đầu tiên.

Lazy Initialization cũng chỉ vận động tốt với ngôi trường hợp công tác của họ là solo luồng (single-thread). Nếu tại 1 thời điểm mà tất cả hai luồng (multi-thread) cùng gọi đến phương thức getInstance() thì sẽ xẩy ra trường hợp 2 thực thể (instance) sẽ được khởi chế tạo ra cùng một lúc.Để khắc phục nhược điểm trên, phương pháp Thread Safe Singleton đã làm được ra đời.

Thread Safe Initialization

Thread Safe Initialization tự khắc phục nhược điểm của Lazy Initialization bằng cách gọi phương thức synchronized của hàm getInstance(). Do vậy sẽ bảo vệ cho việc tại một thời điểm chỉ gồm một luồng (single-thread) được phép truy vấn vào hàm getInstance() và chỉ có duy nhất 1 instance của class.

Tuy nhiên, phương thức này đã làm lịch trình chạy chậm trễ và tốn hiệu năng. Ngẫu nhiên một Thread nào gọi đến đều đề nghị chờ nếu có một Thread khác đang sử dụng. Có những tác vụ cách xử trí trước và sau khoản thời gian tạo instance không quan trọng phải block. Do thế chúng ta cần bao gồm một phương thức ưu việt hơn, đó chính là Double check Locking Singleton.

*

Ví dụ của Thread Safe Initialization

Double kiểm tra Locking Singleton

Để implement Singleton pattern theo phong cách này, họ sẽ bình chọn sự vĩnh cửu instance của class, với sự cung ứng của nhất quán hóa, nhị lần trước lúc khởi tạo. Bạn cần khai báo volatile cho instance nhằm tránh class thao tác làm việc không đúng mực do quy trình tối ưu hóa của trình biên dịch

*

Ví dụ về Double check Locking Singleton

Bill Pugh Singleton Implementation

Bill Pugh Singleton implementation tạo thành static nested class với tính năng 1 Helper lúc muốn tách bóc biệt chức năng cho 1 class function ví dụ hơn. Đây là biện pháp thường được sử dụng nhiều cùng có hiệu suất tốt.

*

Ví dụ về Bill Pugh Singleton Implementation

Trong lúc Singleton được cài vào bộ lưu trữ thì Singleton Helper vẫn không được tải vào. Singleton Helper chỉ được tải vào khi cách thức getInstance() được gọi. Cách thức này giúp tránh được lỗi chính sách khởi sản xuất thực thể của Singleton vào Multi-Thread, performance cao. Vì đã bóc biệt được quá trình xử lý. Cũng chính vì vậy mà cách thức này được tín đồ lập trình đánh giá là cách thực thi Singleton nhanh và tác dụng nhất.

Reflection Singleton Pattern

Reflection hoàn toàn có thể được dùng làm phá đổ vỡ Pattern của Eager Initialization và Bill Pugh Singleton như ví dụ bên dưới đây:

*

Ví dụ về Reflection Singleton Pattern

Khi đó đầu ra của lịch trình là:

*

Enum Singleton

Khi cần sử dụng Enum các params chỉ được khởi chế tạo 1 lần duy nhất. Đây cũng là cách để bạn tạo thành Singleton instance.

Ví dụ:

*

Lưu ý 2 điều dưới đây khi sử dụng Enum Singleton:

Enum hoàn toàn có thể sử dụng như 1 Singleton. Nhược điểm của nó là thiết yếu extends xuất phát điểm từ 1 class được, nên lúc sử dụng đề nghị xem xét vấn đề này.

Hàm constructor của enum là có tính chất lazy, nghĩa là khi được sử dụng mới chạy hàm khởi tạo thành và nó chỉ chạy độc nhất một lần. Nếu bạn có nhu cầu sử dụng như 1 Eager Singleton thì nên gọi stance vào một static block khi bắt đầu chương trình.

Serialization và Singleton

Trong các khối hệ thống phân tán (distributed system), đôi lúc chúng ta cần implement interface Serializable trong lớp Singleton để chúng ta cũng có thể lưu trữ trạng thái của chính nó trong file khối hệ thống và tróc nã xuất lại nó sau.

Ví dụ:

*

Đoạn code test quy trình Serialize/ Deserialize:

*

Output của công tác là:

*

Như sinh hoạt ví dụ trên, Deserialize đối tượng của Serialized Singleton không giống với đối tượng người sử dụng gốc.

Nhưng nó sẽ không xảy ra khi chúng ta dùng cách thức Enum.

Trên thực tế, vẫn đang còn cách khắc chế khi sử dụng class Serialized Singleton là implement một cách tiến hành readResolve(). Dẫu vậy khi chúng ta thật sự chạm mặt vấn đề cùng cần áp dụng Serialize/ Deserialize, thì nên cần sử dụng Enum sẽ đơn giản và dễ dàng hơn.

Một số áp dụng của Singleton Pattern

Chúng ta hoàn toàn có thể thấy Singleton Pattern được ứng dụng trong những trường hợp:

Trường hợp giải quyết các câu hỏi cần truy vấn vào những ứng dụng như: truy vấn giao diện phần cứng, tệp cấu hình, Shared resource, Logger, Configuration, Caching, Thread pool ,...Cụ thể:Truy cập bối cảnh phần cứng: Singleton được sử dụng tùy ở trong vào yêu cầu. Các lớp Singleton cũng khá được sử dụng để phòng chặn truy cập đồng thời của class. Trên thực tế, Singleton có thể được thực hiện trong trường thích hợp yêu cầu giới hạn sử dụng khoáng sản phần cứng mặt ngoài. Ví dụ điển hình như: máy in phần cứng địa điểm mà cỗ đệm in rất có thể được tạo thành thành một Singleton nhằm tránh nhiều truy vấn đồng thời và tạo ra tắc nghẽn.

Logger: các class Singleton được ứng dụng trong số tệp nhật ký. Những tệp nhật ký được chế tạo bởi đối tượng người tiêu dùng class trình ghi nhật ký. Ví dụ, một ứng dụng trong các số đó tiện ích ghi nhật ký phải tạo một tệp nhật ký dựa vào các thông báo nhận được từ người dùng. Nếu có không ít ứng dụng khách thực hiện lớp ứng dụng ghi nhật ký này, chúng hoàn toàn có thể sẽ tạo nhiều bạn dạng sao của lớp này và có thể gây ra lỗi trong quy trình truy cập cùng lúc vào cùng một file trình ghi nhật ký. Bạn có thể dùng lớp tiện ích ghi nhật ký như một lớp đối chọi và cung ứng một điểm tham chiếu tầm thường để mọi người dùng hoàn toàn có thể sử dụng tiện ích này và không tồn tại 2 người tiêu dùng nào truy vấn nó và một lúc.

Tệp cấu hình: Singleton pattern rất tương xứng để ứng dụng vào tệp thông số kỹ thuật vì nó bức tường ngăn nhiều người tiêu dùng truy cập tiếp tục và gọi tệp cấu hình hoặc tệp ở trong tính.

Một số kiến thiết pattern sử dụng Singleton để thiết kế: Abstract Factory, Builder, Prototype, Facade,…

Sử dụng trong: java.lang.Runtime, java.awt.Desktop,..

Xem thêm: Kols Marketing Là Gì ? Vai Trò Kols Và Phân Loại Các Nhóm Kol Hiện Nay

Trên đó là một số mọi ứng dụng phổ cập của Singleton pattern. Kế bên ra, Singleton pattern còn có khá nhiều ứng dụng khác.

Qua nội dung bài viết trên, chúng tôi hy vọng đã giúp bạn hiểu rộng về Singleton pattern là gì? Chức năng, các cách thực thi và áp dụng của Singleton pattern vào thực tế. Từ đó bạn cũng có thể áp dụng Singleton một cách hiệu quả nhất trong quá trình của bản thân nhé!