×

Cách triển khai Singleton pattern trong Java?

Singleton Pattern là một kỹ thuật trong lập trình hướng đối tượng được sử dụng để đảm bảo rằng một lớp chỉ có một thể hiện duy nhất và cung cấp một cách để truy cập đến thể hiện đó từ bất cứ đâu trong chương trình. Dưới đây là ba cách phổ biến để triển khai Singleton Pattern trong Java:

Triển khai Lazy Initialization Singleton

Triển khai này tạo ra thể hiện của lớp chỉ khi nó cần thiết, giúp tiết kiệm tài nguyên.

public class SingletonLazy {
    private static SingletonLazy instance;

    private SingletonLazy() {}

    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

Tuy nhiên, cách này không thread-safe. Để làm cho nó thread-safe, bạn có thể sử dụng từ khóa synchronized trong phương thức getInstance(), nhưng điều này có thể làm giảm hiệu suất.

Triển khai Eager Initialization Singleton

Triển khai này tạo ra thể hiện của lớp ngay khi lớp được tải vào bộ nhớ. Nó đơn giản và thread-safe mà không cần sử dụng synchronized, nhưng nó không tiết kiệm tài nguyên như phương pháp lazy initialization.

public class SingletonEager {
    private static final SingletonEager instance = new SingletonEager();

    private SingletonEager() {}

    public static SingletonEager getInstance() {
        return instance;
    }
}

Triển khai Thread-Safe Singleton sử dụng Double-Checked Locking

Phương pháp này kết hợp hiệu suất của lazy initialization với sự an toàn của thread-safe mà không làm giảm hiệu suất nhiều như sử dụng synchronized trên toàn phương thức.

public class SingletonDoubleChecked {
    private static volatile SingletonDoubleChecked instance;

    private SingletonDoubleChecked() {}

    public static SingletonDoubleChecked getInstance() {
        if (instance == null) {
            synchronized (SingletonDoubleChecked.class) {
                if (instance == null) {
                    instance = new SingletonDoubleChecked();
                }
            }
        }
        return instance;
    }
}

Triển khai sử dụng Inner Static Helper Class

Phương pháp này tận dụng cơ chế loading class của Java để tạo singleton mà không cần lo lắng về vấn đề đa luồng.

public class SingletonHelper {
    private SingletonHelper() {}

    private static class SingletonHolder {
        private static final SingletonHelper INSTANCE = new SingletonHelper();
    }

    public static SingletonHelper getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

Enum Singleton

Cách đơn giản và hiệu quả nhất để tạo một singleton trong Java, đảm bảo an toàn về mặt đa luồng và còn giúp chống lại việc tạo đối tượng thông qua phản xạ.

public enum SingletonEnum {
    INSTANCE;

    public void someMethod() {
        // Phương thức của bạn ở đây
    }
}

Mỗi phương pháp có những ưu và nhược điểm riêng, tùy thuộc vào yêu cầu cụ thể của ứng dụng mà bạn nên chọn phương pháp phù hợp nhất.

Comments