from abc import ABCMeta, abstractmethod # ---------------------------------------- # Product # ---------------------------------------- class Player: ''' Product ''' def __init__(self, face=None, body=None, arm=None, leg=None): self.face = face self.body = body self.arm = arm self.leg = leg def __str__(self): return (f'{self.face}, ' f'{self.body}, ' f'{self.arm}, ' f'{self.leg}.') # ---------------------------------------- # Builder # ---------------------------------------- class PlayerBuilder(metaclass=ABCMeta): @abstractmethod def build_face(self): pass @abstractmethod def build_body(self): pass @abstractmethod def build_arm(self): pass @abstractmethod def build_leg(self): pass # ---------------------------------------- # Concrete Builder # ---------------------------------------- class SexyGirlBuilder(PlayerBuilder): def __init__(self): self.player = Player() def build_face(self): self.player.face = '漂亮脸蛋' def build_body(self): self.player.body = '苗条' def build_arm(self): self.player.arm = '漂亮胳膊' def build_leg(self): self.player.leg = '大长腿' class MonsterBuilder(PlayerBuilder): def __init__(self): self.player = Player() def build_face(self): print('怪物脸') def build_body(self): print('怪物身体') def build_arm(self): print('怪物胳膊') def build_leg(self): print('怪物腿') # ---------------------------------------- # Director # ---------------------------------------- class PlayerDirector: @staticmethod def build_player(_builder): _builder.build_body() _builder.build_face() _builder.build_arm() _builder.build_leg() return _builder.player # ---------------------------------------- # client # ---------------------------------------- builder = SexyGirlBuilder() director = PlayerDirector() player = director.build_player(builder) print(player) |
|