1
0
Fork 0
design-patterns/python/builder/main.py

122 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
实例
汤宝宝想要建造一栋属于自己的房子,于是找来了著名的建筑设计
公司——生成者模式公司Builder Pattern Inc.)帮忙设计和建造房子。
"""
from abc import ABC, abstractmethod
# 产品: 房子
class House(ABC):
foundation: str
structure: str
roof: str
# 抽象建造者: 房屋建造者
class HouseBuilder(ABC):
@abstractmethod
def buildFoundation(self) -> None:
pass
@abstractmethod
def buildStructure(self) -> None:
pass
@abstractmethod
def buildRoof(self) -> None:
pass
@abstractmethod
def getHouse(self) -> House:
pass
# 具体建造者: 木屋建造者
class WoodenHouseBuilder(HouseBuilder):
def __init__(self):
self.house = House()
def buildFoundation(self) -> None:
self.house.foundation = "木桩地基"
print(" 建造木桩地基")
def buildStructure(self) -> None:
self.house.structure = "木结构"
print(" 建造木结构")
def buildRoof(self) -> None:
self.house.roof = "木屋顶"
print(" 建造木屋顶")
def getHouse(self) -> House:
return self.house
# 具体建造者: 砖房建造者
class BrickHouseBuilder(HouseBuilder):
def __init__(self):
self.house = House()
def buildFoundation(self) -> None:
self.house.foundation = "混凝土地基"
print(" 建造混凝土地基")
def buildStructure(self) -> None:
self.house.structure = "砖结构"
print(" 建造砖结构")
def buildRoof(self) -> None:
self.house.roof = "瓦屋顶"
print(" 建造瓦屋顶")
def getHouse(self) -> House:
return self.house
# 指挥者
class Director:
builder: HouseBuilder
house: House
def reset(self) -> None:
if hasattr(self, "house"):
del self.house
def setBuilder(self, builder: HouseBuilder) -> None:
self.builder = builder
def constructHouse(self):
self.reset()
self.builder.buildFoundation()
self.builder.buildStructure()
self.builder.buildRoof()
self.house = self.builder.getHouse()
def main():
print("======== 生成者模式 ========")
director = Director()
print("建造木屋:")
builder = WoodenHouseBuilder()
director.setBuilder(builder)
director.constructHouse()
house = director.house
print(f"木屋建造完成: {house.foundation}, {house.structure}, {house.roof}\n")
print("建造砖房:")
builder = BrickHouseBuilder()
director.setBuilder(builder)
director.constructHouse()
house = director.house
print(f"砖房建造完成: {house.foundation}, {house.structure}, {house.roof}\n")
print("====== 生成者模式结束 ======")
if __name__ == "__main__":
main()