Singleton trong Java - Cách triển khai và ví dụ mà mọi LTV cần biết
30/08/2021 00:53
Trong những bài viết trước, chúng ta đã tìm hiểu và triển khai các lớp bình thường trong Java. Bây giờ chúng ta sẽ thảo luận về lớp Singleton trong Java. Một lớp Singleton trong Java thuộc một trong năm mẫu thiết kế singleton sáng tạo trong Java. Các lớp này khác với các lớp bình thường và chúng ta sử dụng chúng để phục vụ một số yêu cầu cụ thể và đơn giản hóa việc sử dụng cũng như loại bỏ các nút thắt mà chúng ta gặp phải trong quá trình phát triển ứng dụng java .
Trong bài viết này, chúng ta sẽ tìm hiểu lớp singleton là gì và cách triển khai một lớp singleton trong Java. Có một số cách khác nhau để triển khai lớp này trong Java. Chúng ta sẽ thảo luận về từng cách này với cách triển khai và ví dụ trong bài viết dưới đây:
Lớp Singleton trong Java
Lớp Singleton trong Java là một trong nhóm của Bốn Mẫu Thiết kế. Nó thuộc loại mô hình thiết kế sáng tạo trong Java. Một lớp Singleton trong Java chỉ cho phép một cá thể được tạo và cung cấp quyền truy cập toàn cục vào tất cả các lớp khác thông qua đối tượng hoặc cá thể đơn lẻ này. Tương tự như các trường tĩnh, Các trường thể hiện (nếu có) của một lớp sẽ chỉ xuất hiện trong một thời gian duy nhất.
Mục đích của lớp Singleton trong Java
Mục đích của Singleton là để kiểm soát việc tạo ra đối tượng, giới hạn số lượng đối tượng tạo ra là chỉ một. Điều này thường đảm bảo rằng có quyền kiểm soát truy cập vào tài nguyên, ví dụ, plug-in hoặc kết nối cơ sở dữ liệu.
Sự lãng phí không gian bộ nhớ không xảy ra với việc sử dụng lớp singleton vì nó hạn chế việc tạo cá thể. Vì việc tạo đối tượng sẽ chỉ diễn ra một lần thay vì tạo nó mỗi khi có yêu cầu mới. Chúng ta có thể sử dụng đối tượng này nhiều lần theo yêu cầu. Đây là lý do tại sao các ứng dụng cơ sở dữ liệu và đa luồng hầu hết sử dụng mẫu Singleton trong Java để lưu vào bộ nhớ đệm, ghi nhật ký, gộp luồng, cài đặt cấu hình và hơn thế nữa.
>>> Đọc thêm: Static trong Java - Khám phá biến lớp và phương thức tĩnh trong Java
Cách thiết kế lớp Singleton trong Java
Để thiết kế một lớp singleton, chúng ta cần thực hiện những việc sau:
- Đầu tiên, khai báo hàm tạo của lớp Singleton với từ khóa private. Chúng tôi khai báo nó là private để không có lớp nào khác có thể khởi tạo hoặc tạo đối tượng từ nó.
- Một biến tĩnh riêng của cùng một lớp là thể hiện duy nhất của lớp.
- Khai báo một phương thức static factory với kiểu trả về là một đối tượng của lớp singleton này.
Sự khác biệt giữa lớp Thường và lớp Singleton trong Java
Chúng ta có thể phân biệt một lớp Singleton với các lớp thông thường liên quan đến quá trình khởi tạo đối tượng của lớp. Để khởi tạo một lớp bình thường, chúng ta sử dụng một hàm tạo java . Mặt khác, để khởi tạo một lớp singleton, chúng ta sử dụng phương thức getInstance (). Sự khác biệt khác là một lớp bình thường biến mất khi kết thúc vòng đời của ứng dụng trong khi lớp singleton không phá hủy khi hoàn thành một ứng dụng.
Các hình thức của mẫu thiết kế Singleton
Có hai dạng mô hình thiết kế singleton, đó là:
- Early Instantiation: Việc tạo đối tượng diễn ra tại thời điểm tải.
- Lazy Instantiation: Việc tạo đối tượng được thực hiện theo yêu cầu.
>>> Đọc thêm: Console trong Java - Phương thức đọc input Console trong Java
Cách triển khai lớp Singleton trong Java
Phương thức khởi tạo Eager
Kỹ thuật cơ bản và đơn giản nhất để tạo một lớp Singleton là phương pháp Khởi tạo Eager. Với cách tiếp cận này, đối tượng hoặc thể hiện của lớp được tạo khi JVM tải bộ nhớ cho đối tượng. Chúng tôi thực hiện điều này bằng cách gán trực tiếp tham chiếu cho đối tượng.
Chúng ta có thể sử dụng kỹ thuật này khi chúng ta biết rằng chương trình sẽ luôn sử dụng đối tượng / thể hiện của lớp này. Ngoài ra, chúng tôi sử dụng kỹ thuật này khi chi phí tạo phiên bản không quá cao về tài nguyên và thời gian.
Để tạo một lớp singleton bằng phương pháp Khởi tạo Eager, chúng ta cần làm theo các bước sau:
- Khai báo hàm tạo của lớp là private.
- Bây giờ, hãy tạo một thành viên lớp riêng cho lớp Singleton này.
- Trong bước tiếp theo, bạn cần xác định một phương thức factory sẽ trả về đối tượng của lớp Singleton.
Ưu điểm
- Kỹ thuật khởi tạo Eager rất đơn giản để thực hiện.
Nhược điểm
- Vì đối tượng của một lớp luôn được tạo cho dù bạn có cần hay không, điều này có thể dẫn đến lãng phí tài nguyên.
- Ngoài ra còn có sự lãng phí thời gian CPU trong việc tạo một phiên bản không cần thiết.
- Với cách tiếp cận này, chúng ta không thể sử dụng Xử lý ngoại lệ.
>>> Tham khảo: Khóa học lập trình Java
Phương thức khởi tạo Lazy
Như chúng ta biết rằng việc sử dụng phương thức Khởi tạo Eager để tạo một lớp singleton có thể dẫn đến việc tạo một đối tượng không cần thiết, cho dù ứng dụng có đang sử dụng nó hay không. Vì vậy, để khắc phục vấn đề này, có một kỹ thuật khác để tạo một lớp singleton tức là, phương thức Lazy Initialization.
Phương thức Lazy Initialization trì hoãn việc khởi tạo lớp cho đến khi nó cần thiết. Nói cách khác, đối tượng chỉ được tạo ra khi nó được yêu cầu. Phương thức này giúp tránh việc tạo cá thể lớp không cần thiết.
Để tạo một lớp singleton bằng phương pháp Lazy Initialization, chúng ta cần làm theo các bước sau:
- Khai báo hàm tạo của lớp là private.
- Tạo một cá thể tĩnh riêng của lớp này nhưng không khởi tạo nó.
- Trong bước cuối cùng, hãy tạo một phương thức nhà máy. Phương thức này trước tiên sẽ kiểm tra xem thành viên thể hiện có là null hay không. Nếu nó không phải là null, thì nó sẽ tạo một thể hiện của lớp singleton cho bạn và trả về nó; nếu không, nó sẽ không tạo ra bất kỳ trường hợp nào.
Ưu điểm
- Việc tạo một đối tượng chỉ diễn ra khi nó được yêu cầu. Điều này ngăn ngừa sự lãng phí tài nguyên và thời gian của CPU.
- Kỹ thuật này cũng có thể xử lý ngoại lệ.
Nhược điểm
- Cần phải kiểm tra điều kiện của null mỗi lần.
- Chúng ta không thể truy cập trực tiếp đối tượng của lớp.
Phương thức luồng an toàn
Một phương thức singleton an toàn cho luồng tạo ra một lớp Singleton ngay cả trong môi trường đa luồng. Chúng ta cần đánh dấu phương thức getInstance () là 'đồng bộ hóa'. Việc đánh dấu phương thức này là được đồng bộ hóa đảm bảo rằng nhiều luồng không thể truy cập nó đồng thời.
Ưu điểm
- Có thể khởi tạo lười biếng với phương thức Thread-safe.
- Nó cũng an toàn theo chủ đề.
Nhược điểm
- Phương thức getInstance () được đồng bộ hóa, điều này làm chậm hiệu suất của ứng dụng vì nó hạn chế đa luồng được truy cập đồng thời.
Kết luận: Bài viết trên đã giới thiệu tới bạn về Singleton, hy vọng các bạn có thể hiểu rõ về Singleton và thành tháo các phương thức khởi tạo Singleton. Tìm hiểu thêm về Java và các ngôn ngữ lập trình qua các khóa học lập trình tại Viện Công nghệ thông tin T3H.