Bạn đã từng nghe về khái niệm Design Patterns và muốn tìm hiểu thêm thông qua các ví dụ viết bằng ngôn ngữ Python? Trong bài viết này, tôi sẽ giới thiệu cho bạn một số Pattern trong phần I – Creational Design Patterns (Mẫu kiến tạo) và cung cấp ví dụ cụ thể.
Abstract Factory (Nhà máy trừu tượng)
Mục đích của Abstract Factory là trừu tượng hoá việc tạo ra các đối tượng dựa theo logic kinh doanh, nền tảng và những yếu tố khác. Ví dụ, chúng ta có thể tạo ra các con vật nuôi (pet) phụ thuộc vào nhà máy ta chọn (Dog, Cat hoặc random_animal). Chúng ta tạo ra các con vật theo cách trừu tượng và sau đó quyết định lựa chọn con vật cụ thể dựa trên một số tiêu chí nhất định, ví dụ như ưu tiên chó hơn mèo.
Dưới đây là một ví dụ code:
class PetShop(object):
def __init__(self, pet_factory):
self.pet_factory = pet_factory
def buy_pet(self):
pet = self.pet_factory()
return pet
class Dog(object):
def __str__(self):
return "I am a Dog"
class Cat(object):
def __str__(self):
return "I am a Cat"
# Sử dụng Abstract Factory để tạo ra các con vật
shop = PetShop(Dog)
dog = shop.buy_pet()
print(dog)
shop = PetShop(Cat)
cat = shop.buy_pet()
print(cat)
Builder (Người xây dựng)
Builder được sử dụng để tách biệt quá trình tạo ra một đối tượng phức tạp từ biểu diễn của nó, cho phép quá trình tạo ra các đối tượng giống nhau từ cùng một họ trở nên dễ dàng. Dưới đây là một ví dụ:
# Abstract Building class
class Building(object):
def __init__(self):
self.build_floor()
self.build_size()
def build_floor(self):
raise NotImplementedError
def build_size(self):
raise NotImplementedError
def __repr__(self):
return 'Floor: {0.floor} | Size: {0.size}'.format(self)
# Concrete Buildings
class House(Building):
def build_floor(self):
self.floor = 'One'
def build_size(self):
self.size = 'Big'
class Flat(Building):
def build_floor(self):
self.floor = 'More than One'
def build_size(self):
self.size = 'Small'
if __name__ == "__main__":
house = House()
print(house)
flat = Flat()
print(flat)
Factory Method (Phương pháp nhà máy)
Factory Method được sử dụng để tạo ra một giao diện cho một phương thức, và việc thực thi phương thức đó sẽ do lớp được khởi tạo thực hiện. Dưới đây là ví dụ minh họa:
class GreekGetter(object):
def __init__(self):
self.trans = dict(dog="σκύλος", cat="γάτα")
def get(self, msgid):
return self.trans.get(msgid, str(msgid))
class EnglishGetter(object):
def get(self, msgid):
return str(msgid)
def get_localizer(language="English"):
languages = dict(English=EnglishGetter, Greek=GreekGetter)
return languages[language]()
if __name__ == '__main__':
e, g = get_localizer(language="English"), get_localizer(language="Greek")
for msgid in "dog parrot cat bear".split():
print(e.get(msgid), g.get(msgid))
Với ví dụ trên, hàm get_localizer()
không trực tiếp thực hiện việc dịch, mà chỉ khởi tạo một đối tượng từ một lớp khác. Sau đó, việc dịch được thực hiện thông qua phương thức get()
của lớp đó. Chẳng hạn, e = get_localizer(language="English")
tương đương với việc khởi tạo e = EnglishGetter()
và sau đó gọi e.get(msgid)
để thực hiện việc dịch.
Việc tạo động lớp như vậy giúp chúng ta linh hoạt trong việc thực thi mã. Chỉ cần truyền vào giá trị của ngôn ngữ (một biến người dùng chọn trên trang web), chúng ta có thể tạo ra một phiên bản của lớp thực hiện việc dịch. Việc xác định lớp cụ thể không còn quan trọng, vì các lớp được tạo ra có cấu trúc tương tự nhau, giúp ẩn đi việc thực hiện cụ thể ở mức thấp hơn.
Như vậy, đây là một số ví dụ về Design Patterns và cách sử dụng ngôn ngữ Python để áp dụng chúng. Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về các mẫu thiết kế và khám phá thêm trong quá trình lập trình.