通俗 Python 設計模式——建造者模式

平田發表於2016-12-29

建造者模式,是建立型模式中的第三種模式,一般的開發過程中用的比較少。所以只做簡單的介紹。

根據書上的介紹,建造者模式通常用於補充工廠模式的不足,尤其是在如下場景中:

  • 要求一個物件有不同的表現,並且希望將物件的構造與表現解耦
  • 要求在某個時間點建立物件,但在稍後的時間點再訪問

看起來是很難理解,其實最常用的一個場景就是運算元據庫的 orm。回想一下,orm 中一個很重要的概念:延遲載入,其實就是建造者模式最常見的應用。

在一開始將 orm 物件構造出來,但並不實際查詢資料,而是在用到具體資料的時候才向資料庫進行查詢。

並且會根據不同的物件,向不同的表進行查詢。

書上原作者的例子比較複雜,就不搬運了,建造者模式在日常開發中確實用的很少。真正遇到時,去查一查怎麼實現就好了。這裡給出一個書中翻譯評審者精簡後的程式碼示例:

class Pizza:
def __init__(self, builder):
    self.garlic = builder.garlic
    self.extra_cheese  = builder.extra_cheese

def __str__(self):
    garlic = 'yes' if self.garlic else 'no'
    cheese = 'yes' if self.extra_cheese else 'no'
    info = ('Garlic: {}'.format(garlic), 'Extra cheese: {}'.format(cheese))
    return '\n'.join(info)

class PizzaBuilder:
    def __init__(self):
        self.extra_cheese = False
        self.garlic = False

    def add_garlic(self):
        self.garlic = True
        return self

    def add_extra_cheese(self):
        self.extra_cheese = True
        return self

    def build(self):
        return Pizza(self)

if __name__ == '__main__':
    pizza = Pizza.PizzaBuilder().add_garlic().add_extra_cheese().build()
    print(pizza)

這個程式碼其實是建造者模式的一種變體,實現了鏈式呼叫。其實這種所謂的鏈式呼叫,也並不是什麼神奇的事情,只是在建造者類的每一個方法裡返回其本身——return self——罷了。

相關文章