有些情況(像訂單)會需要多筆記錄連到同個資料結構,為都得到最新數值。
使用多筆副本是種方法,但易缺漏更新而讓資料不一致。

Change Value to Reference

此時將值改為參考就是個好選擇:設定好存放區,在其中建立物件,之後就可從任意處到存放區讀取它。

# Before
class Customer:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Customer({self.name})"

class Order:
    def __init__(self, customer_name):
        self.customer = Customer(customer_name)

    def print_order_details(self):
        print(f"Order for: {self.customer}")

order1 = Order("John Doe")
order2 = Order("John Doe")
# order1.customer 和 order2.customer 是不同的物件

# After
class Customer:
    _instances = {}

    @staticmethod
    def get_instance(name):
        if name not in Customer._instances:
            Customer._instances[name] = Customer(name)
        return Customer._instances[name]

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Customer({self.name})"

class Order:
    def __init__(self, customer_name):
        self.customer = Customer.get_instance(customer_name)

    def print_order_details(self):
        print(f"Order for: {self.customer}")

order1 = Order("John Doe")
order2 = Order("John Doe")
# order1.customer 和 order2.customer 是同一個物件