抽象工厂设计模式的实现

时间:2019-01-23 09:15:38

标签: python oop design-patterns

我要以OOP方式重写我已经可以使用的Python代码,因为我想以模块化的方式实现它。我有一个使用多个参数获得的数据集。我想实现一个抽象工厂模式,并用它实例化包含不同参数的不同数据集的不同对象。最终目标是使用两个不同的数据集,我可以计算特定的内容,而且我不知道如何实现适用于两个具体对象的方法。

在我共享的图像中,既可以看到抽象工厂方法,又可以看到两个名为FompyDatasetHigh和FompyDatasetLow的具体数据集(我知道UML是不正确的,但仅用于显示结构)。然后,我想实现一种称为Dibl的方法,该方法将两个数据集都作为参数并返回计算。我理解的Abstract Factory方法的实现是在我迷路的方法中实现的。

那么您将如何编写一个将两个具体工厂对象作为参数的方法

我希望我所提供的信息足够多,我可以尝试提供其他信息。

1 个答案:

答案 0 :(得分:1)

如果希望对象具有抽象类中的方法,则具体类需要继承抽象类

# Abstract Builder
class MonsterBuilder:
    def __init__(self):
        self.give_description()
        self.give_equipment()

    def give_description(self):
        raise NotImplementedError

    def give_equipment(self):
        raise NotImplementedError

    def __repr__(self):
        return "{0.description} | Wielding: {0.equipment}".format(self)


# Concrete Builder
class Orc(MonsterBuilder):
    descriptions = [" hungry", "n ugly", "n evil"]

    def give_description(self):
        description = random.choice(self.descriptions)
        self.description = "A{} Orc".format(description)

    def give_equipment(self):
        self.equipment = "blunt sword"

其他选项可能依赖于将参数传递给类:

def create_orc(weapon):

    class Orc(MonsterBuilder):
        descriptions = [" hungry", "n ugly", "n evil"]

        def give_description(self):
            description = random.choice(self.descriptions)
            self.description = "A{} Orc".format(description)

        def give_equipment(self):
            self.equipment = "blunt {}".format(weapon)

    return Orc()

orc_1 = create_orc('knife')
print(orc_1)
# >>> A hungry Orc | Wielding: blunt knife

orc_2 = create_orc('hammer')
print(orc_1)
# >>> An ugly Orc | Wielding: blunt hammer

此仓库中有一些很棒的python OOP模式示例: https://github.com/faif/python-patterns

我还建议您在进入OOP之前先阅读他们的用例,如果使用不当,可能会使您的代码难以阅读。