Singleton pattern là gì

     

Trong nền công nghiệp phần mềm, mô hình Singleton là 1 mẫu kiến tạo phần mềm nhằm hạn chế sự khởi chế tạo của lớp (class) đối tượng. Điều này vô cùng có ích khi bắt buộc một đối tượng đúng đắn để điều phối hành động trên toàn hệ thống. Khái niệm đôi khi được tổng quan hóa đến các khối hệ thống vận hành công dụng hơn khi chỉ bao gồm một đối tượng người sử dụng tồn tại hoặc giảm bớt sự khởi tạo nên một số lượng đối tượng người dùng nhất định. Thuật ngữ này được khởi đầu 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 để triển khai gì? Có các cách nào nhằm implement singleton pattern? Singleton pattern được vận dụng ở đâu? chúng ta 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 trong 5 design pattern thuộc team Creational kiến thiết Pattern.Singleton pattern bảo đảm chỉ tuyệt nhất một bộc lộ (instance) được tạo thành và bạn cũng có thể truy xuất được diễn đạt duy nhất đó đông đảo lúc phần đông nơi vào chương trình.

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

*

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

Singleton pattern dùng để gia công gì?

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

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

Giúp làm chủ việc tầm nã cập xuất sắc hơn bởi vì chỉ có 1 thể hiện nay (instance) duy nhất.

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

Các vẻ ngoài cơ bạn dạng để implement Singleton pattern

Chúng ta bao gồm 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 chính sách dưới cơ bạn dạng dưới đây:

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

Private hoặc protected constructor nhằm 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 để đảm bảo an toàn biến chỉ được khởi tạo trong class.

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

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

Dựa trên mọi nguyên tắc xây dựng Singleton trên, chúng ta có 9 cách implement Singleton pattern sau:

Eager initialization (Khởi chế tạo ra sớm)

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

Ví dụ:

*

Eager initialization dễ setup nhưng nó dễ dàng bị phá vỡ bởi Reflection

Static block initialization

Chúng ta làm tương tự như như Eager initialization chỉ khác tại phần static block hỗ trợ thêm chắt lọc cho vấn đề handle exception hay các xử lý khác.

Ví dụ:

*

Lazy Initialization

Lazy Initialization thành lập và hoạt động đã 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 lập class khi chúng ta không cần. Mặc dù nhiên, đối với thao tác create instance quá lừ đừ thì tín đồ dùng hoàn toàn có thể phải đợi chờ cho lần sử dụng đầu tiên.

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

Thread Safe Initialization

Thread Safe Initialization xung 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(). Bởi vậy sẽ đảm bảo an toàn cho bài toán tại 1 thời điểm chỉ có một luồng (single-thread) được phép truy cập vào hàm getInstance() với chỉ có duy nhất 1 instance của class.

Tuy nhiên, cách thức này vẫn làm chương trình chạy lừ đừ và tốn hiệu năng. Ngẫu nhiên một Thread nào call đến đều đề xuất chờ nếu tất cả một Thread khác đã sử dụng. Gồm có tác vụ xử lý 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 gồm một phương pháp ưu việt hơn, đó đó là Double check Locking Singleton.

Xem thêm: Sự Khác Nhau Giữa Refund Và Reimburse Là Gì, Nghĩa Của Từ Reimburse

*

Ví dụ của Thread Safe Initialization

Double kiểm tra Locking Singleton

Để implement Singleton pattern theo phong cách này, chúng ta sẽ đánh giá sự vĩnh cửu instance của class, cùng với sự cung ứng của đồng bộ hóa, hai lần trước lúc khởi tạo. Bạn phải khai báo volatile cho instance nhằm tránh class làm việc không đúng chuẩn do quá 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 chức năng 1 Helper lúc muốn tách biệt chức năng cho 1 class function rõ ràng hơn. Đây là phương pháp thường được sử dụng nhiều cùng có công suất tốt.

*

Ví dụ về Bill Pugh Singleton Implementation

Trong khi Singleton được thiết lập vào bộ nhớ lưu trữ thì Singleton Helper vẫn chưa được tải vào. Singleton Helper chỉ được cài đặt vào khi phương thức getInstance() được gọi. Phương thức này giúp tránh được lỗi hình thức khởi tạo thực thể của Singleton vào Multi-Thread, performance cao. Bởi đã bóc biệt được quy trình xử lý. Cũng cũng chính vì vậy mà phương pháp này được bạn lập trình review là cách tiến hành Singleton cấp tốc và tác dụng nhất.

Reflection Singleton Pattern

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

*

Ví dụ về Reflection Singleton Pattern

Khi đó output đầu ra của chương trình là:

*

Enum Singleton

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

Ví dụ:

*

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

Enum có thể sử dụng như một Singleton. Nhược điểm của chính nó là không thể extends từ 1 class được, nên lúc sử dụng bắt buộc xem xét sự việc này.

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

Serialization & Singleton

Trong các 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ó thể lưu trữ trạng thái của chính nó trong file khối hệ thống và truy tìm xuất lại nó sau.

Ví dụ:

*

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

*

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

*

Như nghỉ ngơi ví dụ trên, Deserialize đối tượng của Serialized Singleton khác với đối tượng người 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 hạn chế khi thực hiện class Serialized Singleton là implement một cách làm readResolve(). Tuy thế khi họ thật sự chạm mặt vấn đề và cần sử dụng Serialize/ Deserialize, thì cần sử dụng Enum sẽ đơn giản và dễ dàng hơn.

Một số vận 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 việc cần truy cập vào các ứng dụng như: truy cập 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 đồ họa phần cứng: Singleton được áp dụng tùy nằm trong vào yêu cầu. Những lớp Singleton cũng rất được sử dụng để phòng chặn truy cập đồng thời của class. Trên thực tế, Singleton hoàn toàn có thể được thực hiện trong trường hòa hợp yêu cầu giới hạn sử dụng tài nguyên phần cứng mặt ngoài. Chẳng hạn như: sản phẩm in phần cứng vị trí mà bộ đệm in có thể được chế tạo thành một Singleton nhằm mục tiêu 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 những tệp nhật ký. Những tệp nhật ký được chế tạo bởi đối tượng người sử dụng class trình ghi nhật ký. Ví dụ, một ứng dụng trong các số ấy tiện ích ghi nhật ký phải khởi tạo một tệp nhật ký dựa vào các thông báo nhận được từ fan dùng. Nếu có khá nhiều ứng dụng khách áp dụng lớp app ghi nhật cam kết này, chúng có thể sẽ sản xuất nhiều bản sao của lớp này và rất có thể gây ra lỗi trong quá trình truy cập đồng thời vào cùng một file trình ghi nhật ký. Chúng ta có thể dùng lớp ứng dụng ghi nhật ký như một lớp đối chọi và hỗ trợ một điểm tham chiếu chung để mọi cá nhân dùng rất có thể sử dụng ứng dụng này và không tồn tại 2 người tiêu dùng nào truy cập nó và một lúc.

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

Một số thiết kế pattern áp dụng Singleton nhằm thiết kế: Abstract Factory, Builder, Prototype, Facade,…

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

Xem thêm: Nên Mua Máy May Công Nghiệp Loại Nào, Kinh Nghiệm Mua Máy May Công Nghiệp Chất Lượng

Trên đấy là một số các ứng dụng thông dụng của Singleton pattern. Kế bên ra, Singleton pattern còn có rất nhiều ứng dụng khác.

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