Singleton là một mẫu thiết kế khởi tạo, đảm bảo rằng chỉ có một đối tượng cùng kiểu tồn tại và cung cấp một điểm truy cập duy nhất vào nó cho bất kỳ mã nào khác.

Ví dụ dưới ta có 2 phương thức khởi tạo Singleton.

  • Class SingletonMeta giúp tạo một Singleton được bảo vệ trong khi khởi tạo trong multithreading

  • Class Singleton tạo ra Singleton object nhưng nếu có multithread thì khả năng gây lỗi sẽ xảy ra.

#!/usr/bin/ python3
# coding: utf8

from threading import Lock
from enum import  Enum

class SingletonMeta(type):

    _instances = {}
 
    _lock: Lock = Lock()

 
    def __call__(cls, *args, **kwargs):
        with cls._lock:

            if cls not in cls._instances:
                instance = super().__call__(*args, **kwargs)
                cls._instances[cls] = instance
        return cls._instances[cls]
    
class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        # sourcery skip: instance-method-first-arg-name
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
		
class payment(object, metaclass=SingletonMeta):

    def __init__(self):
	pass