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