Python日记| #16。 patrã³n建筑商
#spanish #python #开发日志

我正在观看有关Python的编程挑战的YouTube视频,在某一时刻,他们提到了类似“可以与Builder Patron实施”之类的内容。

这是我在Java的时间,在那里度过了一年[在这里插入我不记得]。那时,您的资历是由数量的数量以及如何实施它们来定义的。他们是美好的岁月,因为当您了解每个人时,您意识到没有他们,我再也无法生存。

建筑商的赞助人或如何建造东西。

这个设计赞助人旨在从事由许多属性组成的课程,我们并不总是想启动所有属性。

因此,借助著名的所有设定者的基础,创建了建筑商赞助人,该建筑商允许通过所有指向独立形式的属性的人来“部分构建”一个对象。这基本上是一组复杂的播放器。

实施

如果您想跳入完成的示例,我将离开我在Python的翼源存储库的archivo。现在让我们继续逐步。

性别产生英雄

class Hero:
    def __init__(self, name):
        self.name = name
        self.hp = 100
        self.money = 10
        self.attack = 0
        self.defense = 0

    def __str__(self):
        return f"Hero: {self.name} | 💰{self.money}{self.attack} 🛡{self.defense}"

然后出于明显的原因构建 Herobuilder im>。

class HeroBuilder:
    def __init__(self, name):
        self.hero = Hero(name)

这是事物变得有趣的地方:定义我们的英雄的攻击,我们将在同一建筑商中创建一个二传手:

def set_attack(self, attack):
    self.hero.attack = max(attack, 0)
    return self

我通过调用 self.hero 来定义英雄的攻击,因为它是在我的构建器中初始化的对象。但是返回 self ,这可能会使许多人感到困惑。

这个想法是返回对象本身,因此这使我们能够在实例中继续工作。许多人可以告诉我:但是我可以用一个对象英雄及其各自的播放器做同样的事情。这样的东西:

hero = Hero("Tomas")
hero.set_attack(10)
hero.set_defense(5)

是的,但是您无法以这种方式链接它们:

hero.set_attack(10).set_defense(5)

这就是为什么我们需要返回 self 的原因,在我们的情况下,这将返回英雄本身。但是让我们继续以一个示例:

def add_money(self, money):
    self.hero.money += max(money, 0)
    return self

这个mâ©everyther Everything是一个增加的二传手,因为我们可以调用它并增加每次呼叫的金钱(只要它的值大于零)。

def get_hero(self):
    return self.hero

最后,这个世界将返回对象英雄,我们与我们的建筑商进行了修改。问题是:我们如何实施?

builder = HeroBuilder("Tomas")
builder.set_attack(5).set_defense(10)
builder.add_money(10).add_money(20).add_money(30)
hero = builder.get_hero()

print(hero)

首先,我们将构建器对象放置。然后,我们按照自己的意愿称呼很多。他们可以注意到我所说的 add_money 大约三遍,这表明了这位赞助人的灵活性。另一方面,他们注意到大家如何拥有所有这些:当然,他们在使用的许多库中看到了这种实现。建筑商的赞助人无处不在,并且是自定义对象时存在的强大顾客之一。

您最终可以观察我的英雄对象如何声明,然后在屏幕上打印。这将导致以下内容:

Hero: Tomas | 💰70 ⚔5 🛡10

结论

我发现玩物体并给他们我的形状非常有趣。这种设计模式使我没有任何限制,因为正如我之前所说,这是一种与二传手合作的有效方法。

我希望您喜欢这种交付,不要忘记喜欢并分享它,以夸耀您现在知道另一种有趣的设计模式!