Python 构造游戏编程代码的设计模式

Python 构造游戏编程代码的设计模式,python,design-patterns,Python,Design Patterns,我正在编写一个库,我想以一种潜在用户可以轻松使用这个库的方式来构造我的代码。我看了很棒的API设计的优秀视频。黄金法则之一是要有一个好的设计模式。我有两个想法。立面设计模式和工厂设计模式。这两种设计模式都用于实现程序代码的高度抽象,供用户使用 我发现很难在哪一个或哪两个方面都适用。当然,我希望避免出现反模式的情况 我使用的语言是Python,这与上面提供的视频链接中强调的Java非常不同。 我的图书馆将如何运作: Character class Window class 可以创建许多角色对象

我正在编写一个库,我想以一种潜在用户可以轻松使用这个库的方式来构造我的代码。我看了很棒的API设计的优秀视频。黄金法则之一是要有一个好的设计模式。我有两个想法。立面设计模式和工厂设计模式。这两种设计模式都用于实现程序代码的高度抽象,供用户使用

我发现很难在哪一个或哪两个方面都适用。当然,我希望避免出现反模式的情况

我使用的语言是Python,这与上面提供的视频链接中强调的Java非常不同。 我的图书馆将如何运作:

Character class
Window class
可以创建许多角色对象

假设我要使用facade设计模式,我会在facade构造函数中初始化这两个类,以便在方法中调用它们:

类Facade():

在这里,我将创建表示character和window类中创建的方法的方法。用户可以轻松地调用这些命令:

Facade = Facade()
Facade.methodUsedInCharacterClass()
Facade.methodUsedInCharacterClass()
Facade.methodUsedInWindowClass()
但是这里我看到门面有一个问题,你可以有两个不同的角色,你需要做不同的事情。您可以这样做:

Facade = Facade()
badguy= Facade.methodUsedInCharacterClass()
goodguy= Facade.methodUsedInCharacterClass()
Facade.methodUsedInWindowClass()
然后不能使用badguy或goodguy变量调用其他行为,例如

badguy.rotate()
goodguy.jump()
这是不允许的,但有办法做到这一点吗

另外,当构造函数调用类时,可以使用工厂方法,根据我自己的理解,它在运行时选择要执行的类。我只能想象,但在这种情况下,它将如何应用


谢谢

您似乎误解了工厂和立面模式的目的

工厂模式是用来建造东西的。因此,您将有一个
字符工厂
和一个
窗口工厂
。如果客户需要特殊字符,他们需要一种方法将默认的
CharacterFactory
替换为他们的

然后,字符工厂应该能够生成不同类型的字符。这样,你可以为你的游戏建立默认的好人和坏人。然后,客户可以覆盖这些方法来修改默认值

立面用于使对象看起来像是不同类型的对象。因此,您的窗口可能具有类型为
View
的子窗口。
CharacterView
将是一个facade,它将来自角色的信息映射到
View
界面的数据中,然后窗口可以使用该界面来显示诸如健康状况之类的信息,而不必了解角色或健康状况

这意味着您还需要一个包含默认工厂的配置对象。客户可以从
ConfigFactory
中获得其中一个

class ConfigFactory:
    def createConfig(self):
        config = Config()
        config.characterFactory = self.createCharacterFactory()
        return config

    def createCharacterFactory(self):
        return CharacterFactory()
客户将覆盖此项以获得自己的工厂:

class CustomConfigFactory(ConfigFactory):
    def createCharacterFactory(self):
        return CustomCharacterFactory()

您似乎误解了工厂和立面模式的目的

工厂模式是用来建造东西的。因此,您将有一个
字符工厂
和一个
窗口工厂
。如果客户需要特殊字符,他们需要一种方法将默认的
CharacterFactory
替换为他们的

然后,字符工厂应该能够生成不同类型的字符。这样,你可以为你的游戏建立默认的好人和坏人。然后,客户可以覆盖这些方法来修改默认值

立面用于使对象看起来像是不同类型的对象。因此,您的窗口可能具有类型为
View
的子窗口。
CharacterView
将是一个facade,它将来自角色的信息映射到
View
界面的数据中,然后窗口可以使用该界面来显示诸如健康状况之类的信息,而不必了解角色或健康状况

这意味着您还需要一个包含默认工厂的配置对象。客户可以从
ConfigFactory
中获得其中一个

class ConfigFactory:
    def createConfig(self):
        config = Config()
        config.characterFactory = self.createCharacterFactory()
        return config

    def createCharacterFactory(self):
        return CharacterFactory()
客户将覆盖此项以获得自己的工厂:

class CustomConfigFactory(ConfigFactory):
    def createCharacterFactory(self):
        return CustomCharacterFactory()

对你的例子不是一个门面,它是工厂、配置工厂和配置的混合体,加上一个活动扳手。哈哈!好的,谢谢你提供的信息,我需要更令人信服的解释,我会继续寻找和理解!“抽象层次”是指“使相互独立”。您所做的是尝试将所有内容移动到
Facade
类中,而不是创建独立的部分,然后将这些部分连接在一起。我已经厌倦了应用本文的建议:示例(计算机Facade)是用java编写的,我就是这样做的。所以我的类是window和character,其中定义了方法。类似角色:旋转、移动和窗口:收进背景图片。然后我使用对象来创建它来调用facade中的方法。但是本文明确指出facade应该只有几个方法(通常是1-2)。是的。你的例子不是一个门面,它是工厂、配置工厂和配置的混合体,加上一个活动扳手。哈哈!好的,谢谢你提供的信息,我需要更令人信服的解释,我会继续寻找和理解!“抽象层次”是指“使相互独立”。您所做的是尝试将所有内容移动到
Facade
类中,而不是创建独立的部分,然后将这些部分连接在一起。我已经厌倦了应用本文的建议:示例(计算机Facade)是用java编写的,我就是这样做的。所以我的类是window和character,其中定义了方法。类似角色:旋转、移动和窗口:收进背景图片。然后我使用对象来创建它来调用facade中的方法,但本文明确指出facade应该只有几个方法(通常为1-2)。