Featured image of post Design Patern - Singleton Pattern và cách apply Singleton Pattern vào Service để load config cho toàn bộ App

Design Patern - Singleton Pattern và cách apply Singleton Pattern vào Service để load config cho toàn bộ App

Bài trước chúng ta đã nói về Factory Pattern và các áp dụng Factory để xử lý các phương thức thanh toán khác nhau. Trong bài này, chúng ta sẽ cùng nhau tìm hiểu về Singleton Pattern và cách mà mình apply Singleton Patter vào dự án thực tế

Giới thiệu về Singleton Pattern

Singleton Pattern là một pattern cực kỳ phổ biến trong Design Pattern, nó thuộc nhóm các mẫu thiết kế khởi tạo (Creational Patterns). Mục đích của Singleton là đảm bảo rằng một class chỉ có một instance duy nhất và cung cấp một điểm method để truy cập đến instance đó. Đây là một mẫu thiết kế rất phổ biến trong lập trình hướng đối tượng, đặc biệt là khi cần quản lý tài nguyên dùng chung hoặc config hệ thống mà chỉ cần một instance duy nhất

Khi nào nên sử dụng Singleton Pattern

Singleton Pattern được sử dụng trong các trường hợp sau:

  • Khi cần kiểm soát truy cập đến một tài nguyên dùng chung: Ví dụ, một kết nối cơ sở dữ liệu duy nhất có thể được chia sẻ giữa nhiều phần của ứng dụng.
  • Khi cần giữ một instance duy nhất của một class: Điều này thường được sử dụng trong các class quản lý config hệ thống hoặc ghi nhật ký (logging), nơi mà việc có nhiều instance có thể gây ra vấn đề không nhất quán.
  • Khi cần tiết kiệm tài nguyên: Singleton giúp tiết kiệm bộ nhớ vì chỉ một instance của class được tạo ra và tái sử dụng.

Sử dụng Singleton Pattern để tạo một ConfigurationManager cho toàn bộ Service

Giả sử bạn đang phát triển một hệ thống quản lý config cho một ứng dụng. Cấu hình này cần được truy cập ở nhiều nơi khác nhau trong hệ thống, nhưng bạn chỉ muốn có một bản sao duy nhất của config để đảm bảo tính nhất quán.

Đầu tiên, chúng ta cần tạo class ConfigurationManager để quản lý tất cả các config trong Service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ConfigurationManager {
    // static property  giữ instance duy nhất của class
    private static ConfigurationManager instance;
    
    // property config store config hệ thống
    private Properties config;

    // Method khởi tạo private để ngăn chặn tạo mới instance
    private ConfigurationManager() {
        config = new Properties();
        // Load config từ file hoặc thiết lập mặc định
        config.setProperty("url", "http://example.com");
        config.setProperty("timeout", "5000");
    }

    // Method public để lấy instance duy nhất của class
    public static synchronized ConfigurationManager getInstance() {
        if (instance == null) {
            instance = new ConfigurationManager();
        }
        return instance;
    }

    // Method lấy giá trị config
    public String getConfig(String key) {
        return config.getProperty(key);
    }
}

Sau đó, Sử dụng Class ConfigurationManager để load config cho toàn bộ Service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Application {
    public static void main(String[] args) {
        // Lấy instance duy nhất của ConfigurationManager
        ConfigurationManager configManager = ConfigurationManager.getInstance();
        
        // Sử dụng config
        String url = configManager.getConfig("url");
        System.out.println("Connecting to: " + url);
        
        // Tất cả các nơi khác trong ứng dụng sẽ sử dụng cùng một instance của ConfigurationManager
    }
}

Tổng kết

Singleton Pattern là một mẫu thiết kế hữu ích khi bạn cần đảm bảo rằng chỉ có một instance duy nhất của một class được tạo ra trong suốt vòng đời của service. Mẫu này giúp quản lý tài nguyên hiệu quả mà còn đảm bảo tính nhất quán của dữ liệu.

Tuy nhiên, bạn cần sử dụng Singleton một cách cẩn thận, vì nếu không kiểm soát tốt, nó có thể dẫn đến các vấn đề như khó khăn trong unit testing và phụ thuộc vào trạng thái của instance. Singleton Pattern là một mẫu thiết kế mạnh mẽ và hữu ích khi bạn cần đảm bảo rằng chỉ có một instance duy nhất của một class được tạo ra trong suốt vòng đời của ứng dụng.

Hy vọng qua bài viết này mình đã giới thiệu tổng quan về Singleton Pattern và cách apply Single vào các business case thực tế của mọi người!

HAPPY CODING!

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy