122 lines
2.8 KiB
Python
122 lines
2.8 KiB
Python
"""
|
||
实例
|
||
汤宝宝想要建造一栋属于自己的房子,于是找来了著名的建筑设计
|
||
公司——生成者模式公司(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()
|