我编写了一个库,我希望以一种潜在用户易于使用该库的方式构建我的代码。我查看了this出色的API设计视频。其中一条黄金法则是拥有良好的设计模式。我有两个想法。 Facade design 模式和工厂设计模式。这两个设计模式都用于在程序代码中实现高级抽象,供用户使用。
我觉得它很难或两者都适用。当然,我想避免使用反模板。
我使用的语言是Python,它与Java完全不同,在上面提供的视频链接中强调了这一点。 我的图书馆将如何运作:
Character class
Window class
可以创建许多角色对象。
如果我要使用外观设计模式,我会在外观构造函数中初始化这两个类,以便可以在方法中调用它们:
class Facade():
__init__(self): self.character = Character() self.window = 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()
这是不允许的,但有没有办法做到这一点?
此外,当构造函数调用类时,可以使用工厂方法,该方法在运行时选择由我自己理解执行的类。我只能想象,但在这种情况下它会如何适用?
谢谢!
答案 0 :(得分:1)
你似乎误解了工厂和门面模式的目的。
工厂模式用于构建东西。因此,您将拥有CharacterFactory
和WindowFactory
。如果客户需要特殊字符,他们需要一种方法来替换您的默认CharacterFactory
。
然后角色工厂应该能够生成不同类型的角色。这样,您可以为您的游戏构建默认的好人和坏人。然后,客户可以覆盖这些方法来修改默认值。
外观用于使对象看起来像是不同类型。因此,您的窗口可能有View
类型的子项。然后,CharacterView
将是一个外观,它将来自角色的信息映射到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()